繁体   English   中英

接口和BindingList的C#协方差

[英]c# covariance with Interface and BindingList

在这里无法理解问题:

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

    BindingList<T1> DataSource { get; }
}

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

错误与BindingList声明有关。

谢谢。

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

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

    IReadOnlyList<T1> DataSource { get; }
}

在声明变体类型时,您仅限于单一差异类型。

例如,如果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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM