2012-08-01 72 views
5

是否有可能有一個泛型約束是一個無限泛型類型?C#無限泛型作爲約束

例如:

public T DoSomething<T>(T dictionary) where T : IDictionary<,> 
{ 
    ... 
} 

編輯:只是爲了解釋的背景下,我想約束的方法,以一個IDictionary的使用,但該方法本身也並不完全沒關係TKey和TValue是什麼。

+4

'public V DoSomething (IDictionary dictionary)'這是你的意思嗎? – oleksii 2012-08-01 18:06:50

+1

Amir Abiri,你爲什麼要返回類型與參數類型'T'相同?你要返回參數嗎?這可能沒有必要。你不能輕易地構建另一個'T'。除非你想約束'T:new()'。 – 2012-08-01 18:31:07

回答

6

這是不可能的,你需要指定類型參數:

public T DoSomething<T, TKey, TValue>(T dictionary) where T : IDictionary<TKey, TValue> { ... } 
+1

你會發現有趣的是TKey和TValue可以從T中推斷出來,而我並不需要它們在方法體內的任何地方。所以我希望能使通用簽名更清潔。 – 2012-08-01 18:33:05

+0

@AmirAbiri - 你可以將'T'限制爲非泛型'IDictionary'嗎? – Lee 2012-08-01 18:39:59

+0

其實我只用IDictionary來簡化這個例子。我真正的類型是「BaseGameState 的任何子類」(即T不是接口,它是我自己的基類)。 – 2012-08-01 18:42:39

0

不,你不能這樣做。也許你可以使用

public IDictionary<TKey, TValue> DoSomething<TKey, TValue>(IDictionary<TKey, TValue> dictionary) 
{ 
... 
} 
1

有一個在rosylin github一個問題,但是,它尚未完成。所以現在不可能,但我預計它會很快。