21

Tを次のように制約すると:次のようなオブジェクト:

public interface IDoWork<T> where T : Object
{
    T DoWork();
}

エラーが発生します:

制約を特別なクラス'オブジェクト'にすることはできません

それは、コンパイルする以下のものとの暗黙の違いがあることを意味しますか?

public interface IDoWork<T> // where T : Object
{
    T DoWork();
}
4

3 に答える 3

57

ジェネリック型を参照型に制限する場合は、を使用します: class

public interface IDoWork<T> where T : class
{
    T DoWork();
}

これにより、ジェネリック型が構造体などの値型になることが禁止されintます。

于 2012-05-17T23:15:49.093 に答える
14

2つの制約の間に違いはありませんが、明示的に述べることが役に立たないために1つが許可されていない点が異なります。

C#4.0言語仕様(10.1.5タイプパラメーターの制約)では、これについて2つのことが述べられています。

タイプはオブジェクトであってはなりません。すべてのタイプはオブジェクトから派生するため、許可されている場合、このような制約は効果がありません。

..。

Tに主制約または型パラメーター制約がない場合、その有効な基本クラスはオブジェクトです。

あなたのコメントの中で、あなたTはタイプを作ろうとしていると言いましたVoidVoidは、リターンタイプがなく、の代わりに使用できないことを示す特殊なタイプでTあり、適切な具象タイプが必要です。メソッドのvoidバージョンと、T両方が必要な場合はバージョンを作成する必要があります。

于 2012-05-17T23:32:06.677 に答える
0

C#4.0言語仕様(コード化:[10.1.5]タイプパラメーターの制約)によると、次の2つのことがわかります。

1]タイプはオブジェクトであってはなりません。すべてのタイプはオブジェクトから派生するため、許可されている場合、このような制約は効果がありません。

2] Tに主制約または型パラメーター制約がない場合、その有効な基本クラスはオブジェクトです。

ジェネリッククラスを定義する場合、クラスをインスタンス化するときにクライアントコードが型引数に使用できる型の種類に制限を適用できます。クライアントコードが制約で許可されていない型を使用してクラスをインスタンス化しようとすると、コンパイル時エラーが発生します。これらの制限は制約と呼ばれます。制約は、wherecontextualキーワードを使用して指定されます。 ジェネリック型を参照型に制限する場合は、:classを使用します。

MSDNによると

制約を特別なクラス「識別子」にすることはできません。次のタイプは制約として使用できません。

  • System.Object
  • System.Array
  • System.Delegate
  • System.Enum
  • System.ValueType。
于 2015-04-30T08:19:31.020 に答える