2013-05-13 131 views
0

下面的代码...如何在泛型类声明中使用泛型?

class Repository<T> where T : Func<TIn, TOut> 
{ 
//... 
} 

导致VS抱怨“的类型或命名空间名称‘锡’/‘吹捧’不能被发现。”

有没有办法做到这一点?

+0

你不能约束一个类型'T'到'Func键'因为你canonly约束类型接口,非密封类或类型。 – 2013-05-13 11:57:40

+0

Func 是一种类型 – Kenneth 2013-05-13 11:59:46

+0

@Kenneth对不起,应该说“类型参数”不只是“类型” – 2013-05-13 12:04:49

回答

3

如果Func本身是一个通用类,然后是你可以通过:

class Repository<T, TIn, TOut> where T: Func<TIn, TOut> 

但是,你不能用Func做到这一点,因为它只能通过一个接口/非密封类受到约束或一个类型参数。

作为替代方案,你可以通过Func在构造函数参数,它工作即

class Repository<TIn, TOut> 
{ 
    public Repository(Func<TIn, TOut> func) 
    { 
     ... 
    } 
} 

不是真的知道这会给你你虽然之后在做什么。

0

您必须在类的定义指定TInTOut的“投入”,否则,编译器不会从那里拿了那

class Repository<T, TIn, TOut> where T : Func<TIn, TOut> 
{ 
    //... 
} 
0

你不能约束一个类型弄清楚T到Func,因为你只能将类型约束到接口,非密封类或类型参数。

如果可以做到这一点,就应该是这样的:

class Repository<T, TIn, Tout> where T: Func<TIn, TOut> 
{ 
    //... 
} 

但你不能约束到Func<>,所以整个事情是注定的。

从编译器中的错误信息是:

错误1 'System.Func' 是不是一个有效约束。用作约束的类型必须是接口,非密封类或类型参数。

1

由于您已经知道您想要的类型,因此不需要对其进行约束。 我想你想要的是这样的:

class Repository<TIn, TOut> 
{ 
    public void someMethod(Func<TIn, TOut> func) 
    { 

    } 
} 
+0

这看起来像答案。 – 2013-05-13 12:19:19