public static void IsNotNull<T>(T value) where T : class
我只是覺得有些經驗不足的開發商將在將值傳遞類型認爲它會拋出一個異常,如果值爲0.
更新: 有沒有辦法將參數限制爲C#1.0中的引用類型?
public static void IsNotNull<T>(T value) where T : class
我只是覺得有些經驗不足的開發商將在將值傳遞類型認爲它會拋出一個異常,如果值爲0.
更新: 有沒有辦法將參數限制爲C#1.0中的引用類型?
正如我在評論說,在回答「爲什麼」,是因爲泛型在C#1.0中不可用時Assert.IsNotNull
寫。改變它,雖然可以(更)更正確,但有可能破壞現有的代碼。無論更好還是更糟糕,微軟都非常重視保持現有代碼的正常運行。
正如我在上OP評論說,一個更好的選擇的簽名會'無效IsNotNull
感謝您的回答。請看我更新的問題。有沒有辦法將參數約束爲C#1.0中的引用類型? –
不,仿製藥不存在;也沒有約束。 –
因爲函數的目的是斷言value != null
和null
是一個獨立於任何類型參數的值,所以添加類型參數將是毫無意義的開銷。
它不會毫無意義,因爲它會阻止人們傳遞值類型,這是不好的,因爲它們不能爲空。 –
我看不到你的推理。我認爲向函數傳遞一個值類型是可行的,並且該斷言將是正確的,因爲該值確實不會爲空。 – d3dave
是的,但這是不直觀的。我認爲任何將值類型傳遞給此方法的開發人員都不知道裝箱方法,並且假設值爲0時會引發異常。 –
如果一個具有代碼可以,在不同情況下產生的非空值類型和任一個或兩個可爲空值類型和引用類型的?
除了沒有一種好的方法來覆蓋約束中的引用類型和可爲空的值類型,我剛描述的那種代碼對於不應該導致null的情況不再可測試。 (例如Enumerable.Max()
可以返回所有這些類型的,但絕不能返回null,如果有序列中至少一個非空值,並且必須返回null,如果類型可以爲空,序列爲空)。
減少功能,以避免誤用是唯一有價值的,如果你能證明所有這些用途也是錯誤的。這不僅不能被證明是真實的,而且可能被證明是虛假的。
我懷疑的答案,「爲什麼呢?」是您提出的語法在C#1.0中無法使用的語法。 –
@丹有沒有其他的語法可以工作? –
@Backwards_Dave是的,你不滿意:)之一 - 仿製藥是在2.0中引入的(這是後1.0/1.1版本的.NET),之前唯一的選擇是使用'object'(見'ArrayList'爲另一隻恐龍)。 –