2

我正在尝试创建一个 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"),
};

我认为使用动态并不是最好的方法......请有人阐明!

编辑

该死的我忘记了错误

无法将类型 DataTableColumn< int >' 隐式转换为 'IDataTableColumn< object >'。存在显式转换(您是否缺少演员表?)

无法隐式转换类型 DataTableColumn< System.DateTime?>' 到 'IDataTableColumn< 对象 >'。存在显式转换(您是否缺少演员表?)

4

1 回答 1

4

我相信这是因为intDateTime是不协变的值类型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.

于 2011-06-10T18:11:53.923 回答