如何实现不通用的通用参数

我有两个通用参数的接口,但其中一个参数预计由类实现提供。

public interface IA<T, U> { ... }
public class X<T> : IA<T, int> { ... }
public class Y<T> : IA<T, MyClass> { ... }

然而,另一个接口有一个将IA的实例作为参数的方法 - 但是,每个实例必须是相同的(同一个类可以接受多个X ,但不会接受Y ,反之亦然)。 我试图把它作为一个通用约束,但是我有类似的东西

public interface IB<T, U, V> where U : IA<T, V> {
   void MyMethod(U value);
}
public class Z<T> : IB<T, X<T>, int> { ... }

当然,我不想写这个参数V ,因为我不能为它选择一个值。 参数U已经规定了V的值应该是什么! 但是,我不能简单地删除V ,因为那样我就无法写出约束。


另一个解决方案是不使用约束:

public interface IB<T> {
   void MyMethod(IA<T> value);
}

但是这样一来,我无法确保IB的实施将只能得到一个IA实现(即它将能够同时接收XY ,而不应该)。


有没有办法避免在接口IB创建通用参数V (在第一种解决方案中),而仍然相互排除IA的实现? 是否有任何特定的原因,编译器无法推断V的类型,并允许我只写class Z<T> : IB<T, X<T>>或者这种情况在语言规范中是不期望的选择不执行?


您已经有足够的泛型类型来限制IB<T,U>.MyMethod()接收XY 您只需要将方法参数定义为接受特定类型。

    public interface IA<T,U> {}
    public class X<T> : IA<T,int> {}
    public class Y<T> : IA<T,string> {}

    public interface IB<T,U>
    {
        void MyMethod(IA<T,U> value);
    }

    IB<int,int> foo;
    X<int> a;
    Y<int> b;

    foo.MyMethod(a); // will compile
    foo.MyMethod(b); // will not compile

有没有办法避免在接口IB中创建通用参数V(在第一种解决方案中),而仍然相互排除IA的实现? 是否有任何特定的原因,编译器无法推断V的类型,并允许我只写Z类:IB>或者这种情况只是在语言规范中没有预期/被选择为不被实现?

我不认为这就是C#中推理的作用。 为了推断U的类型, MyMethod将被这样写入。

    public interface IB<T>
    {
        void MyMethod<U>(IA<T,U> value);
    }

    IB<int> foo = null;
    X<int> a;
    foo.MyMethod(a); // int type is inferred by compiler

您仍然必须在您的IB接口中使用IA<T,U> 。 我不认为有一个简单的方法。

链接地址: http://www.djcxy.com/p/21719.html

上一篇: How to implement a generic parameter that isn't generic

下一篇: Include generated makefile without warning message