以下代码......
class Repository<T> where T : Func<TIn, TOut>
{
//...
}
导致VS抱怨&#34;类型或命名空间名称&#39; TIn&#39; /&#39; TOut&#39;无法找到。&#34;
有没有办法做到这一点?
答案 0 :(得分:3)
如果Func
本身是一个通用类,那么你可以通过:
class Repository<T, TIn, TOut> where T: Func<TIn, TOut>
但是,您无法使用Func
执行此操作,因为它只能由接口/非密封类或类型参数约束。
作为替代方案,您可以将Func
作为构造函数参数传递,将工作,即
class Repository<TIn, TOut>
{
public Repository(Func<TIn, TOut> func)
{
...
}
}
不确定这会不会给你你所追求的东西。
答案 1 :(得分:1)
由于您已经知道了所需的类型,因此无需对其进行约束。 我想你想要的是:
class Repository<TIn, TOut>
{
public void someMethod(Func<TIn, TOut> func)
{
}
}
答案 2 :(得分:0)
您必须在类的定义中为TIn
和TOut
指定“输入”,否则,编译器无法确定从哪里开始
class Repository<T, TIn, TOut> where T : Func<TIn, TOut>
{
//...
}
答案 3 :(得分:0)
您不能将类型T
约束为Func,因为您只能将类型约束到接口,非密封类或类型参数。
如果您可以这样做,它将如下所示:
class Repository<T, TIn, Tout> where T: Func<TIn, TOut>
{
//...
}
但你不能约束Func<>
,所以整件事都注定要失败。
编译器的错误消息是:
错误1'System.Func'不是有效约束。用作约束的类型必须是接口,非密封类或类型参数。