如何在泛型类声明中使用泛型类型?

时间:2013-05-13 11:54:32

标签: c# generics

以下代码......

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

导致VS抱怨&#34;类型或命名空间名称&#39; TIn&#39; /&#39; TOut&#39;无法找到。&#34;

有没有办法做到这一点?

4 个答案:

答案 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)

您必须在类的定义中为TInTOut指定“输入”,否则,编译器无法确定从哪里开始

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'不是有效约束。用作约束的类型必须是接口,非密封类或类型参数。