受Phil Haack's attempt on null or empty coalescing的啓發,我試圖爲string
對象以及IEnumerable<T>
接口編寫幾個擴展方法來簡化無效或無效的ckecking。然而,我遇到了一些問題:當我試圖調用AsNullIsEmpty
的版本時,編譯器將我的字符串視爲IEnumerable<char>
,當然會給出錯誤的返回類型。對C#泛型的反約束
有沒有什麼辦法對的IEnumerable
版本的定義把「反限制」,這樣我可以告訴編譯器使用一個每當T
類型是不string
?像
public static IEnumerable<T> AsNullIfEmpty(this IEnumerable<T> items)
where T !: string
東西,我知道我可以只改變其中一人的名字,但我想有一致性相同的名稱。
更新:原來我的問題與擴展方法解決了另一種方式,通過固定的簡單和愚蠢的錯誤(我用的是str.IsNullOrEmpty()
,在IEnumerable<T>
擴展方法,而不是string.IsNullOrEmpty(str)
...),但由於對泛型的反約束問題仍然是一個有趣的問題,我不會刪除它。
編譯器將採取最具體的可用方法。如果你實現了一個字符串,並確保它可以在Call站點使用,那麼就不會有像描述的那樣的問題 – 2010-07-15 12:28:38