Проблема ковариации массива реального мира - PullRequest
2 голосов
/ 10 июня 2011

Я пытаюсь создать массив класса DataTableColumn, но, к сожалению, я схожу с ума от этого. Сейчас это то, что я пытался сделать без успеха

public interface IDataTableColumn<out TValue> {
    string Expression { get; }
    DataTableFilterType FilterType { get; }

    TValue Cast(string value);
}

public class DataTableColumn<TValue> : IDataTableColumn<TValue> {
    public DataTableColumn(string expression, DataTableFilterType filterType = DataTableFilterType.Equal) {
        Expression = expression;
        FilterType = filterType;
    }

    public string Expression { get; private set; }
    public DataTableFilterType FilterType { get; private set; }

    public TValue Cast(string value) {
        return value.As<TValue>();
    }
}

Мой массив ДОЛЖЕН быть

private readonly IDataTableColumn<object>[] _columns = {
    new DataTableColumn<int>("Id"), // ERROR
    new DataTableColumn<string>("Description", DataTableFilterType.StartsWith), // SUCCESS
    new DataTableColumn<DateTime?>("Date"), // ERROR
};

На самом деле так работает

private readonly dynamic[] _columns = {
    new DataTableColumn<int>("Id"),
    new DataTableColumn<string>("Description", DataTableFilterType.StartsWith),
    new DataTableColumn<DateTime?>("Date"),
};

Я думаю, что использование динамического не лучший способ сделать это ... кто-то пролить свет, пожалуйста!

EDIT

Черт, я забыл ошибку

Невозможно неявно преобразовать тип DataTableColumn 'для 'IDataTableColumn <объект>'. явное преобразование существует (вы пропустил актерский состав?)

Невозможно неявно преобразовать тип DataTableColumn 'к 'IDataTableColumn <объект>'. явное преобразование существует (вы пропустил актерский состав?)

1 Ответ

4 голосов
/ 10 июня 2011

Я полагаю, это потому, что int и DateTime являются типами значений, которые не ковариантны с object (для них требуется бокс).Я получаю следующую ошибку при компиляции вашего кода:

covar.cs(23,13): error CS0266: Cannot implicitly convert type
    'DataTableColumn<System.DateTime>' to 'IDataTableColumn<object>'.
    An explicit conversion exists (are you missing a cast?)

Для MSDN, «Разница в универсальных интерфейсах (C # и Visual Basic)» * :

Дисперсия в универсальных интерфейсах поддерживается только для ссылочных типов.Типы значений не поддерживают дисперсию.Например, IEnumerable<int> (IEnumerable(Of Integer) в Visual Basic) не может быть неявно преобразовано в IEnumerable<object> (IEnumerable(Of Object) в Visual Basic), поскольку целые числа представлены типом значения.

DataTableColumn<string> работает, потому что происходит от object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...