参数必须为输入安全错误
本文关键字:安全 错误 输入 参数 | 更新日期: 2023-09-27 18:02:32
这是我的一段代码:
public interface IA<in TInput>
{
void Method(IB<TInput> entities);
}
public interface IB<in T> { }
我不知道为什么我得到以下编译错误:参数必须是输入安全的。无效方差:类型参数|TInput|必须在"IB<在T>。在T>
c#中的逆变指示符(即in
)仅在直接级别上是直观的,当您创建一个"接受"泛型类型参数的方法时。然而,在内部,逆变意味着关系(带有解释的Q& a)的反转,因此在IA
中使用in
使其与IB
不相容。
Animal
及其派生类Tiger
。我们还假设IB<T>
有一个方法void MethodB(T input)
,该方法从IA
的Method
:
调用class A_Impl<T> : IA<T> {
T data;
public void Method(IB<TInput> entities) {
entities.MethodB(data);
}
}
声明IA<in TInput>
和IB<in TInput>
意味着你可以做
IA<Animal> aForAnimals = new A_Impl<Animal>();
IA<Tiger> aForTigers = aForAnimals;
IA<in TInput>
有一个接受IB<TInput>
的方法,我们可以这样调用:
aForTigers.Method(new B_Impl<Tiger>());
这是一个问题,因为现在A_Impl<Animal>
传递Animal
给MethodB
的接口,期望Tiger
。
你不会有IB<out T>
的问题,虽然-协方差和逆变:
public interface IB<out T> {
// ^^^
}
// This works
public interface IA<in TInput> {
void Method(IB<TInput> x);
}
// This works too
public interface IC<out TInput> {
void Method(IB<TInput> x);
}