3

このような署名を持つジェネリック関数を作成したい:必要な特定のインターフェイスの実装である必要があるvoid funcName<T>()場所。Tそのようなチェックを行う方法は?certan インターフェイスを実装するジェネリック関数クラス型に渡す方法は?

だから私はいくつかを作成し、悲しいことに次public interface IofMine {}のような関数を作成しようとします:public static void funcName<T>() where T : IofMine { var a = new T}

エラー: new() 制約がないため、変数型 'T' のインスタンスを作成できません

関数が受け取るクラス型を目的のインターフェイスにするだけでなく、コンストラクターも持たせるにはどうすればよいですか?

4

4 に答える 4

5

ジェネリック パラメーターに既定のコンストラクターがあることを要求するにnew()は、ジェネリック制約の一部として指定します。

public static void funcName<T>() where T : IofMine, new()
{
    T a = new T();
}

これは、デフォルト (つまり、パラメーターなし) のコンストラクターを要求する場合にのみ使用できます。たとえば、文字列パラメーターを取るコンストラクターを要求することはできません。

于 2012-07-23T03:59:24.123 に答える
2

単純:

public void FuncName<T>(...) 
    where T : IMyInterface
{
    ...
}

これにより、型パラメーターに制約が作成Tされるため、メソッドの呼び出し時に使用されるすべての型でを実装する必要がありますIMyInterface

于 2012-07-23T03:21:44.563 に答える
2

これはあなたがそれを宣言する方法です:

// Let's say that your function takes
// an instance of IMyInterface as a parameter:
void funcName<T>(T instance) where T : IMyInterface {
    instance.SomeInterfaceMethodFromMyInterface();
}

これはあなたがそれを呼ぶ方法です:

IMyInterface inst = new MyImplOfMyInterface();
funcName(inst);
于 2012-07-23T03:21:54.877 に答える
2

私があなたが正しいと理解した場合、あなたはジェネリックの制約を使用する必要があります:

public interface TestInterface
{
}

public void func<T>()
    where T : TestInterface
{ 

}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

于 2012-07-23T03:21:56.860 に答える