3

我想创建一个具有这样签名的通用函数:需要void funcName<T>()在哪里T实现我想要的某些特定接口。如何进行这样的检查?如何传递给实现 certan 接口的泛型函数类类型?

所以我创建了一些public interface IofMine {},并尝试创建一个类似的函数public static void funcName<T>() where T : IofMine { var a = new T},遗憾的是我得到了:

错误:无法创建变量类型“T”的实例,因为它没有 new() 约束

我应该怎么做才能使我的函数接收的类类型不仅是我想要的接口而且还有一个构造函数?

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 回答