[英]Properly implementing IComparable<T> on a Struct in C# 8 with Nullable set to enable
現在啟用 Nullable 時,在 C# 8 中實現 CompareTo 的正確方法是什么。 Visual Studio 中的實現接口功能建議使用此簽名:
public struct PackageVersionNumber : IComparable<PackageVersionNumber>
{
public int Major { get; }
public int Minor { get; }
public int Patch { get; }
public int CompareTo([AllowNull] PackageVersionNumber other)
{
// ...
}
}
PackageVersionNumber 在這種情況下是一個結構,實際上不應該是 null。 我可以安全地從參數中刪除[AllowNull]
屬性,還是需要將其保留在那里並真正檢查 null。 或者這是一個錯誤?
TL;博士
您可以安全地從方法簽名中刪除此屬性。
解釋
在您的CompareTo
方法簽名中,該結構是按值傳遞的,並且未標記為可為空。 這是PackageVersionNumber
結構的正確接口實現。
這意味着,無論您做什么, other
參數值都不能是null
。
你甚至不能寫if (other == null)
- 這會產生編譯器錯誤(除非你為PackageVersionNumber
重載==
運算符,順便說一下你應該真正考慮的結構)。
但即使使用重載的==
運算符, if (other == null)
比較總是會產生false
- 所以不需要檢查。 重載運算符將允許編譯器將PackageVersionNumber
隱式轉換為可為空PackageVersionNumber?
在比較中 - 你會得到一個 CS0472 警告:
表達式的結果始終為“假”,因為“PackageVersionNumber”類型的值永遠不會等於“PackageVersionNumber?”類型的“null”。
我想 Visual Studio 中的“實現接口”功能不考慮實現接口的類型,並且始終使用與AllowNullAttribute
相同的代碼段。
該屬性對於實現不可為空的引用類型的接口確實很有用。 雖然它們是“邏輯上”不可為空的,但仍有一種方法可以在運行時獲取null
值 - 因此需要進行 null 檢查以避免NullReferenceException
。 此外,您必須確保與使用 C#7.x 及更低版本編譯的程序集的向后兼容性 - IComparable<T>
完全允許null
用於引用類型的T
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.