所以我讀Eric Lippert's 'Constraints are not part of the signature',現在我明白規範指定在重載解析後檢查類型約束,但我仍不清楚爲什麼必須如此。下面是Eric的例子:爲什麼類型約束不是方法簽名的一部分?
這不會編譯因爲重載解析:Foo(new Giraffe())
推斷Foo<Giraffe>
是最好的超負荷比賽,但隨後的類型約束失敗和編譯時錯誤被拋出。用埃裏克的話來說:
這裏的原則是重載決議(和方法類型推理)找到參數列表和每個候選方法的形式參數列表之間的最佳可能匹配。也就是說,他們看候選方法的簽名。
類型約束不是簽名的一部分,但爲什麼他們不能?在某些情況下,考慮類型約束是簽名的一部分是個壞主意?難以或不可能實現?我並不主張如果最好的選擇超載是出於任何原因不可能打電話,然後默默地回退到第二好的;我會討厭這個。我只是想了解爲什麼類型約束不能用來影響最佳過載的選擇。
我想象中的內部C#編譯器,只有重載的目的(它不會永久改寫法)以下內容:
static void Foo<T>(T t) where T : Reptile { }
被轉化爲:
static void Foo(Reptile t) { }
爲什麼不能將類型約束「拉進」形式參數列表?這是如何以任何不好的方式改變簽名的?我覺得它只是加強了簽名。那麼Foo<Reptile>
將永遠不會被視爲超載候選人。
編輯2:難怪我的問題很混亂。我沒有正確閱讀埃裏克的博客,我引用了一個錯誤的例子。我在我認爲更合適的例子中進行了編輯。我也將標題更改爲更具體。這個問題似乎並不像我想象的那麼簡單,也許我錯過了一些重要的概念。我不太確定這是否是stackoverflow材料,因此最好將此問題/討論移到其他地方。
您在問題頂部引用的關於鬣蜥的一點是爲了說明類型推斷*會考慮約束的情況,即對C中約束條件的限制,因此重載決議最終選擇本例中的*非泛型*方法。你確定*這是你想要提出這個問題的文章的相關位?問題的其餘部分似乎並不遵循邏輯。 – 2012-02-25 05:02:52
我覺得你打算問爲什麼當類型推斷*成功*但推斷違反方法類型參數*的約束*的類型時,爲什麼在有替代方法時重載解析失敗。我發現這個問題很混亂,但是再一次,這是規範中令人困惑的部分。 – 2012-02-25 05:05:43
你說得對。我誤讀了您的博客,並使用了錯誤的示例。難怪我的問題很困惑。我試圖盡我所能地澄清我的問題;我還將閱讀您的其他一些博客文章,看看我是否可以提高我對這個主題的理解。 – Daryl 2012-02-26 01:31:30