0

以下代码...

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

导致 VS 抱怨“找不到类型或命名空间名称 'TIn'/'TOut'”。

有没有办法做到这一点?

4

4 回答 4

3

如果Func它本身是一个泛型类,那么是的,你可以通过:

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

但是,您不能这样做,Func因为它只能受接口/非密封类或类型参数的约束。

作为替代方案,您可以将Funcin 作为构造函数参数传递,它起作用,即

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

不太确定这是否会给你你所追求的。

于 2013-05-13T11:56:17.730 回答
1

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

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

    }
}
于 2013-05-13T12:11:28.610 回答
0

您必须在类的定义中指定“输入” TInTOut否则,编译器无法确定从何处获取

class Repository<T, TIn, TOut> where T : Func<TIn, TOut>
{
    //...
}
于 2013-05-13T11:57:48.527 回答
0

您不能将类型限制T为 Func,因为您只能将类型限制为接口、非密封类或类型参数。

如果你做到,它看起来像这样:

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

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

来自编译器的错误消息是:

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

于 2013-05-13T12:00:22.690 回答