簡體   English   中英

正確實施 IComparable<t> 在 C# 8 中的結構上,將 Nullable 設置為啟用</t>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM