c # ковариация с интерфейсом и BindingList - PullRequest
0 голосов
/ 17 декабря 2018

Не удалось понять проблему здесь:

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

    BindingList<T1> DataSource { get; }
}

C # Недопустимая дисперсия: параметр типа должен быть неизменным для.является ковариантным.

Ошибка связана с объявлением BindingList.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

При объявлении типа варианта вы ограничены одним видом отклонения.

Например, если 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; }
}
0 голосов
/ 17 декабря 2018

Ковариантный интерфейс может возвращать только ковариантные универсальные типы, которые используют тип varable.Это означает, что возвращаемое значение свойства DataSource также должно быть ковариантным.BindingList не является ковариантным, поэтому его нельзя вернуть методом или свойством ковариантного интерфейса.Ближайший ковариантный интерфейс к BindingList<T> - IReadOnlyList<T> (BindingList<T> реализует его), поэтому вы можете использовать его:

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

    IReadOnlyList<T1> DataSource { get; }
}
...