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

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)のバリエーション」

ジェネリックインターフェイスの差異は、参照型でのみサポートされます。値型は分散をサポートしていません。たとえば、整数は値型で表されるため、(Visual Basicでは)を(Visual Basicでは)にIEnumerable<int>暗黙的IEnumerable(Of Integer)に変換することはできません。IEnumerable<object>IEnumerable(Of Object)

DataTableColumn<string>から直接派生するため、機能しobjectます。

于 2011-06-10T18:11:53.923 に答える