c# 与 Interface 和 BindingList 的协方差

c# covariance with Interface and BindingList

无法理解这里的问题:

public interface ILinkedTabularSectionManager<out T1> where T1 : TabularBusinessObject
{
    T1 LinkedTabularBusinessObject { get; }

    BindingList<T1> DataSource { get; }
}

C# Invalid variance: The type parameter must be invariantly valid on. is covariant.

错误与 BindingList 声明有关。

谢谢。

协变接口只能return 使用变量类型的协变泛型类型。这意味着 DataSource 属性 的 return 值也必须是协变的。 BindingList 不是协变的,因此它不能被协变接口的方法或 属性 return 编辑。最接近 BindingList<T> 的协变接口是 IReadOnlyList<T>BindingList<T> 实现了它),因此您可能想使用这个:

public interface ILinkedTabularSectionManager<out T1> where T1 : TabularBusinessObject
{
    T1 LinkedTabularBusinessObject { get; }

    IReadOnlyList<T1> DataSource { get; }
}

声明变体类型时,您只能使用单一变体类型。

例如,如果 T1 是协变的(你的情况)none 接口成员可以使用不变或逆变数据类型:

// This is valid: T in IEnumerable<T> is covariant
public interface ILinkedTabularSectionManager<out T1> where T1 : TabularBusinessObject
{
    T1 LinkedTabularBusinessObject { get; }

    IEnumerable<T1> DataSource { get; }
}

// This is invalid: T in BindingList<T> is invariant
public interface ILinkedTabularSectionManager<out T1> where T1 : TabularBusinessObject
{
    T1 LinkedTabularBusinessObject { get; }

    BindingList<T1> DataSource { get; }
}

// This is invalid: T in Action<T> is contravariant
public interface ILinkedTabularSectionManager<out T1> where T1 : TabularBusinessObject
{
    T1 LinkedTabularBusinessObject { get; }

    Action<T1> SomeAction { get; }
}