簡體   English   中英

C# 有沒有辦法在 T 上放置 Null 條件運算符(?)?

[英]C# Is there a way to put a Null-conditional operator (?) on T?

我有一個interface<T> 這個接口有一個方法Compare(T x, T y)

  • x永遠不能是null
  • y很有可能是null

我想通過使用 Null 條件運算符來明確這一點? y上: Compare(T x, T? y)

這可能嗎?來自 C# 的哪個版本?

編輯:

T可以是引用類型和值類型。

我在@PanagiotisKanavos 建議的文檔中找到了答案:

https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references#generics

在 C# 8.0 中,使用T? 沒有將T限制為structclass沒有編譯。 這使編譯器能夠解釋T? 清楚地。 在 C# 9.0 中,通過為不受約束的類型參數T定義以下規則,刪除了該限制:

  • 如果T的類型參數是引用類型, T? 引用相應的可為空的引用類型。 例如,如果T是一個string ,那么T? 是一個string? .

  • 如果T的類型參數是值類型, T? 引用相同的值類型T 例如,如果Tint ,則T? 也是一個int

  • 如果T的類型參數是可為空的引用類型,則T? 引用相同的可為空引用類型。 例如,如果T是一個string? ,那么T? 也是一個string? .

  • 如果T的類型參數是可空值類型, T? 引用相同的可為空值類型。 例如,如果Tint? ,那么T? 也是一個int? .

對於我的問題,這意味着我需要將T限制為 class,因為我使用的是 C#8。

鑒於在寫完這個答案之前,沒有提到如果T上存在這樣的條件

public interface IDoWork<T> : where T: ???
{...}

我們假設它是一個引用類型

現在假設T是一個引用類型,那么你應該這樣做

public int Compare(T x, T y)
{

    if (y == null)
        //Take decision accordingly.
    else
        //Take decision accordingly.
}

比較方法不將參數作為可空類型。 它們采用純實例,然后在方法內部根據預期的行為做出決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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