[英]C# variance annotation of a type parameter, constrained to be value type
在C#中可以將方差注釋添加到類型參數,約束為值類型:
interface IFoo<in T> where T : struct
{
void Boo(T x);
}
如果在這種情況下方差注釋完全沒有意義,為什么編譯器允許這樣做?
為什么編譯器允許這樣做,因為在這種情況下,方差注釋完全沒有意義?
它是編譯器允許的,因為當我將方差規則添加到C#4.0編譯器時,我甚至從未考慮過有人會嘗試這樣做。
編譯器警告和錯誤是功能 ,為了實現功能,在發布編譯器之前 ,必須至少考慮它 。 我沒有這樣做,因此從來沒有機會甚至辯論是否應該對這種情況發出警告。
現在您已經引起了我的注意,問題是:它應該是一個功能嗎? 編譯器是否應該針對此案例發出警告(或錯誤)?
這是一個判斷電話。 我們考慮的一些事情是:
代碼是某種人可能會認為它做了一些合理的事情嗎? 人們不希望; 人們希望那些了解類型系統的開發人員能夠創建一個接口變體也知道方差僅適用於引用類型。 但也許有些開發人員可能會認為它會起作用。 至少它似乎沒有合理性。 它沒有明顯的設計。
代碼明顯錯了嗎? 是的,它可能是。 似乎不太可能有人故意想要編寫一個看似變體但實際上並非如此的界面。
等等。
我將不得不更多地考慮它,但乍一看看起來這實際上可能是添加到編譯器的一個不錯的警告。 我將與團隊討論,我們會考慮將其添加到Roslyn版本中。
謝謝你的想法!
它只是因為它是合法代碼而被允許。 它完全沒有害處。 是的,你不能使用逆變換,但我沒有看到問題。 代碼中的任何內容都不會產生誤導或隱藏一些扭曲的問題 。
我只是認為編譯器在檢查方差有效性時不檢查T
是值類型還是引用類型 。 按理說,C#團隊認為使用通用接口方差的任何人都會知道使用值類型這樣做是沒有意義的,並且在任何情況下都沒有副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.