2012-08-26 14 views
5

可能重複:
Generic methods and method overloading爲什麼泛型的含糊不一致,而不是提高錯誤?

說我有喜歡

class SortedList<K> 
{ 
    public string this[int i] { get { return "a"; /* dummy sample code */ } } 
    public string this[K key] { get { return "b"; /* dummy sample code */ } } 
} 

現在一類讓我們說一些傢伙決定使用它:

static string Test1<K>(K key) { return new SortedList<K>()[key]; } 

編譯器將此調用解析爲K key過載。

現在,說

static string Test2(int key) { return new SortedList<int>()[key]; } // whoops 

編譯器在哪裏解決了這個給int i超載對比這一點。

現在,如果一些可憐的靈魂說Test1(0),他會得到一個不同的結果,然後如果他說Test2(0),即使身體乍看起來幾乎相同。

更有意思的是,在任何情況下,編譯器或運行時都檢測不到並給出錯誤。
相反,運行時只是改變其行爲是否值是通用的,這對於調用者而言可能是顯而易見的。

爲什麼的行爲不一致?
或者,更好的是,爲什麼沒有編譯器(或運行時)錯誤,因爲含糊不清?

+0

@SergRogovtsev:哇,很好找!沒有看到那個;似乎完全回答了這個問題。那麼我們應該投票結束我的問題。 – Mehrdad

回答

0

爲什麼hack你認爲,這是不一致的行爲? 它只是一個點,你用一個「maybe-key」類型的獲得者來替換index-getter ...

你認爲什麼,應該是預期的結果?一個警告?這是開發人員需要檢查哪些類型,你想使用哪種類型... 它足夠智能檢查,方法「測試1」將解決基於密鑰的獲取和測試2只有基於索引的獲取...

你必須要麼不允許「INT」類型(帶班約束例如),或在這裏實現的其他消氣方法...

0

因爲編譯器不叫喚的事情警告或錯誤它懷疑可能對你顯得模棱兩可。它召喚出它發現的含糊不清的東西。但是這裏的編譯器沒有什麼不明確的地方。

比方說,我手上你的正方形和矩形,並告訴你把方塊放入a堆中,矩形放入堆中b。此外,你不必看對象,看它們是正方形還是長方形,因爲它們已經被標記爲這樣。現在...在某個時刻,我向您提供了一個標記爲矩形的對象,但您注意到它也恰好是一個正方形。現在,我沒有告訴你分析這些物體......我告訴過你,只是按照我的標記方式按照指示進行組織。這就是編譯器的工作原理......完全按照你所說的去做。

+0

當然,但運行時不能給出錯誤?這似乎比提供不一致的行爲更好。 – Mehrdad

+0

許多人最終爭論(用這麼多的話來說),編譯器以某種方式做某事的事實必定意味着它是正確的。我通常不同意這種邏輯。然而,這種情況是不同的,因爲你說這種行爲是不一致的,但同時你指出它* IS *是一致的,當你根據該值是否是泛型來選擇它時。那麼這裏誰真的不一致呢? :p –

+0

咦?泛型給出了與非泛型不同的行爲,即使類型替換是相同的。我稱之爲不一致。 – Mehrdad

相關問題