接口和BindingList的C#协方差

时间:2018-12-17 08:38:35

标签: c# interface covariance bindinglist

在这里无法理解问题:

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

    BindingList<T1> DataSource { get; }
}
  

C#无效方差:类型参数必须始终有效。   是协变的。

错误与BindingList声明有关。

谢谢。

2 个答案:

答案 0 :(得分:1)

协变接口只能返回使用varable类型的协变泛型类型。这意味着DataSource属性的返回值也必须是协变的。 BindingList不是协变的,因此它不能由协变接口的方法或属性返回。与BindingList<T>最接近的协变接口是IReadOnlyList<T>BindingList<T>实现了它),因此您可能要使用此接口:

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

    IReadOnlyList<T1> DataSource { get; }
}

答案 1 :(得分:0)

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

例如,如果T1是协变的(您的情况),则接口成员中的任何一个都不能使用不变或矛盾的数据类型:

// 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; }
}