我有一个带有两个通用参数的接口,但其中一个参数应该由类实现提供。
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
的一个实现(即它将能够同时接收X
和{{1}它不应该)。
有没有办法避免在接口Y
(在第一个解决方案中)中创建泛型参数V
,同时仍然相互排除IB
的实现?是否有任何特定的原因,编译器无法推断IA
的类型,并允许我只写V
或者这种情况只是在语言规范中没有预期/被选择不实现?
答案 0 :(得分:3)
您已经拥有足够的通用类型来限制IB<T,U>.MyMethod()
同时接收X
和Y
。您只需要将方法参数定义为接受特定类型。
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&gt;或者这种情况只是在语言规范中未被预期/被选择不实施?
我不认为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
您仍需在IA<T,U>
界面中使用IB
。我不认为有一个简单的方法。