是否有可能有一個泛型約束是一個無限泛型類型?C#無限泛型作爲約束
例如:
public T DoSomething<T>(T dictionary) where T : IDictionary<,>
{
...
}
編輯:只是爲了解釋的背景下,我想約束的方法,以一個IDictionary的使用,但該方法本身也並不完全沒關係TKey和TValue是什麼。
是否有可能有一個泛型約束是一個無限泛型類型?C#無限泛型作爲約束
例如:
public T DoSomething<T>(T dictionary) where T : IDictionary<,>
{
...
}
編輯:只是爲了解釋的背景下,我想約束的方法,以一個IDictionary的使用,但該方法本身也並不完全沒關係TKey和TValue是什麼。
這是不可能的,你需要指定類型參數:
public T DoSomething<T, TKey, TValue>(T dictionary) where T : IDictionary<TKey, TValue> { ... }
你會發現有趣的是TKey和TValue可以從T中推斷出來,而我並不需要它們在方法體內的任何地方。所以我希望能使通用簽名更清潔。 – 2012-08-01 18:33:05
@AmirAbiri - 你可以將'T'限制爲非泛型'IDictionary'嗎? – Lee 2012-08-01 18:39:59
其實我只用IDictionary來簡化這個例子。我真正的類型是「BaseGameState >的任何子類」(即T不是接口,它是我自己的基類)。 – 2012-08-01 18:42:39
不,你不能這樣做。也許你可以使用
public IDictionary<TKey, TValue> DoSomething<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{
...
}
有一個在rosylin github一個問題,但是,它尚未完成。所以現在不可能,但我預計它會很快。
'public V DoSomething(IDictionary dictionary)'這是你的意思嗎? –
oleksii
2012-08-01 18:06:50
Amir Abiri,你爲什麼要返回類型與參數類型'T'相同?你要返回參數嗎?這可能沒有必要。你不能輕易地構建另一個'T'。除非你想約束'T:new()'。 – 2012-08-01 18:31:07