![](/img/trans.png)
[英]Solution to the lack of covariance with generics in c# 2.0 (BindingList)
[英]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.