2016-02-24 58 views
0

我有一個類,如:C#未定義泛型類的列表?

class GClass<T1, T2> {} 

實現:

class CClass1<String, String> {} 
class CCLass2<String, Double> {} 

在我的C#代碼,我需要像這樣定義一個List<GClass<T1,?>對象。

可能嗎?

通過另一方面,我曾與List<GClass<String, Object>>測試,但是我不能添加一個對象是這樣的:

List<GClass<String, Object>> list = new List<GClass<String, Object>>(); 
CClass1 c1 = new CClass1(); 
list.Add(c1); 

編譯轉儲我的編譯錯誤。

編輯

我用它測試:

public interface IViz<T, TQuery, out TOut> 
{ 
    Configuration.IVizConfiguration<T> VizConfiguration { get; } 
    IList<TOut> SelectedValues { get; } 

    IEnumerable<TQuery> generate(IEnumerable<T> search); 
    Expression<Func<T, bool>> generateExpression(Object selectedVizValue); 
    IEnumerable<Expression<Func<T, bool>>> generateExpressions(IEnumerable<Object> selectedVizValues); 
} 

然而,編譯器告訴我:

錯誤3無效方差:類型參數 '吹捧' 必須是在'UI.Forms.SearchTool.Visualization.IViz.SelectedValues'上不變。 'TOUT'是協變的。 d:\ PROJECTS \住\用戶\ NetClient \ UI \表格\ SearchTool \可視\ IViz.cs 8 42 UI

+0

你能描述編譯錯誤嗎? – badikumar

+0

'CClass1 {}'CClass1'和'CClass2'是什麼? – Ian

回答

5

您可以通過添加一個接口來完成此行爲,使用通用的修改out你的類型參數,使之協調。

documentation, out (Generic Modifier)

對於一般類型參數,out關鍵字指定該類型參數是協變。您可以在通用接口和委託中使用out關鍵字。

協方差使您能夠使用比通用參數指定的派生類型更多的派生類型。這允許實現變體接口的類的隱式轉換以及隱式轉換委託類型。協方差和反變量支持引用類型,但不支持值類型。

例子:

public interface GInterface<T1, out T2> {} 
public class GClass<T1, T2> : GInterface<T1, T2> {} 

用法:

List<GInterface<String, Object>> list = new List<GInterface<String, Object>>(); 
GClass<string, string> c1 = new GClass<string, string>(); 
list.Add(c1); 
+0

我測試了你的方法。我不知道爲什麼,但編譯器告訴我一個錯誤。看看問題。謝謝! – Jordi

+0

由於'IList'不是協變的,你可能會發現這個錯誤,你可以將它改爲IEnumerable,它是協變的。 –

4

不,你不能這樣做,但你可以定義只具有一般類型的一個通用的接口:

interface IClass<T> { } 
class GClass<T1, T2> : IClass<T1> { } 

class CClass1 : GClass<string, object> { } 
class CClass2 : GClass<string, double> { } 

然後你可以創建一個通用接口列表:

List<IClass<String>> list = new List<IClass<String>>(); 
list.Add(new CClass1()); 
list.Add(new CClass2());