如何在泛型类声明中使用泛型?
问题描述:
下面的代码...如何在泛型类声明中使用泛型?
class Repository<T> where T : Func<TIn, TOut>
{
//...
}
导致VS抱怨“的类型或命名空间名称‘锡’/‘吹捧’不能被发现。”
有没有办法做到这一点?
答
如果Func
本身是一个通用类,然后是你可以通过:
class Repository<T, TIn, TOut> where T: Func<TIn, TOut>
但是,你不能用Func
做到这一点,因为它只能通过一个接口/非密封类受到约束或一个类型参数。
作为替代方案,你可以通过Func
在构造函数参数,它将工作即
class Repository<TIn, TOut>
{
public Repository(Func<TIn, TOut> func)
{
...
}
}
不是真的知道这会给你你虽然之后在做什么。
答
您必须在类的定义指定TIn
和TOut
的“投入”,否则,编译器不会从那里拿了那
class Repository<T, TIn, TOut> where T : Func<TIn, TOut>
{
//...
}
答
你不能约束一个类型弄清楚T
到Func,因为你只能将类型约束到接口,非密封类或类型参数。
如果可以做到这一点,就应该是这样的:
class Repository<T, TIn, Tout> where T: Func<TIn, TOut>
{
//...
}
但你不能约束到Func<>
,所以整个事情是注定的。
从编译器中的错误信息是:
错误1 'System.Func' 是不是一个有效约束。用作约束的类型必须是接口,非密封类或类型参数。
答
由于您已经知道您想要的类型,因此不需要对其进行约束。 我想你想要的是这样的:
class Repository<TIn, TOut>
{
public void someMethod(Func<TIn, TOut> func)
{
}
}
+0
这看起来像答案。 – 2013-05-13 12:19:19
你不能约束一个类型'T'到'Func键'因为你canonly约束类型接口,非密封类或类型。 –
2013-05-13 11:57:40
Func是一种类型 –
Kenneth
2013-05-13 11:59:46
@Kenneth对不起,应该说“类型参数”不只是“类型” – 2013-05-13 12:04:49