2012-08-17 32 views
6

目前正在使用TKey進行排序的雙向查找關聯泛型。在某些時候,我希望能有一個像下面的訪問:通用方法的有條件編譯

public class Assoc<TKey, TValue> 
{ 
    public TKey this[TValue value] { get; } 
    public TValue this[TKey value] { get; } 
} 

但很明顯,當TKEY的== TValue這將失敗。出於好奇,有沒有一個有條件的編譯語法來做到這一點:

public class Assoc<TKey, TValue> 
{ 
    [Condition(!(TKey is TValue))] 
    public TKey this[TValue value] { get; } 

    [Condition(!(TKey is TValue))] 
    public TValue this[TKey value] { get; } 

    public TKey Key(TValue value) { get; } 

    public TValue Value(TKey value) { get; } 
} 
+0

什麼時候使用TKey == TValue類會有用? – casablanca 2012-08-17 01:40:41

+0

'public TKey this [TValue value] {get; ''做?我不理解這個API的目的。 – 2012-08-17 01:54:07

+0

@casablanca,你有沒有使用'Dictionary '?它看起來像傑克希望有一個非常類似於字典的東西,但通過鍵和值的聯想搜索。 – 2012-08-17 02:07:46

回答

4

不,沒有基於泛型類型的條件compilation。

泛型替換在運行時執行,而不是編譯時。

這是.NET泛型和C++模板之間的區別之一。

泛型也沒有專業 C++模板的概念。

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx

+2

+1。注意「泛型在運行時解析,而不是編譯時。」並不完全正確 - 在編譯時,需要正確地找到泛型類中的方法(當編譯器試圖選擇需要使用哪個版本的索引器時,這是Jake的類產生的確切錯誤)。 – 2012-08-17 02:16:35

+2

同意@Alexei;這裏的問題與泛型的運行時行爲無關。這純粹是一個方法重載解析的問題,它是一個編譯時構造。特別是,如果沒有限定符(比如'where TKey:Foo'等),這兩個方法都被編譯器視爲'object',因此正常的方法過載碰撞行爲 - 當兩個方法共享相同的問題時參數類型(即'object') - 踢入。這是*編譯*時間場景。 – 2012-08-17 03:12:55