参数必须为输入安全错误

本文关键字:安全 错误 输入 参数 | 更新日期: 2023-09-27 18:02:32

这是我的一段代码:

public interface IA<in TInput>
{
    void Method(IB<TInput> entities);
}
public interface IB<in T> { }

我不知道为什么我得到以下编译错误:参数必须是输入安全的。无效方差:类型参数|TInput|必须在"IB<在T>。

参数必须为输入安全错误

c#中的逆变指示符(即in)仅在直接级别上是直观的,当您创建一个"接受"泛型类型参数的方法时。然而,在内部,逆变意味着关系(带有解释的Q& a)的反转,因此在IA中使用in使其与IB不相容。

这个问题最好用一个例子来说明。考虑类Animal及其派生类Tiger。我们还假设IB<T>有一个方法void MethodB(T input),该方法从IAMethod: 调用
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>传递AnimalMethodB的接口,期望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);
}