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; }
}
无法理解这里的问题:
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; }
}