2011-06-10 73 views
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 <對象>'。一個 顯式轉換存在(是否 缺少強制轉換?)

無法隱式轉換類型 DataTableColumn < System.DateTime的? >'至 'IDataTableColumn < object>'。一個 顯式轉換存在(是否 缺少強制轉換?)

+1

你得到什麼錯誤? – 2011-06-10 18:06:03

回答

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?) 

Per MSDN, "Variance in Generic Interfaces (C# and Visual Basic)":在通用接口

方差僅支持引用類型。值類型不支持差異。例如,IEnumerable<int>(在Visual Basic中爲IEnumerable(Of Integer))不能隱式轉換爲IEnumerable<object>(在Visual Basic中爲IEnumerable(Of Object)),因爲整數由值類型表示。

DataTableColumn<string>工作,因爲它直接從object派生。

+0

但是沒有辦法做到這樣的事情?沒有辦法? – 2011-06-10 18:13:20

+2

@Kim,答案通常是讓IFoo 從IFoo中派生出來,然後讓你的數組的類型爲IFoo。協變性適用於*參考類型*,這就是您看到錯誤的原因。 – 2011-06-10 18:16:05

+0

好的每個人,我只是想在這裏找到我的問題的'答案',而不是問題的原因。不管怎麼說,還是要謝謝你。 – 2011-06-10 18:42:45