Не могу понять проблему здесь:
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.
Спасибо.
Есть ли способ обойти это? Для того, чтобы там был BindingList?
Чего ты хочешь добиться? Как использовать этот интерфейс?





Ковариантный интерфейс может возвращать только ковариантные универсальные типы, использующие переменную типа. Это означает, что возвращаемое значение свойства 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; }
}
BindingList <T>не допускает вариации параметра типа.