簡體   English   中英

C#添加可空小數和優先級?? 操作者

[英]C# addition with nullable decimals and precedence of ?? operator

假設一個C#程序具有兩個可以為零的十進制屬性A和B.以下加法僅返回A的值:var result = A ?? 0 + B ?? 0; 正確的用法是:var result =(A ?? 0)+(B ?? 0);

示例控制台程序:

class Program
{
    static void Main(string[] args)
    {
        A = (decimal)0.11;
        B = (decimal)0.69;

        NullableDecimalAddition();

        Console.ReadLine();
    }

    public static decimal? A { get; set; }
    public static decimal? B { get; set; }

    private static void NullableDecimalAddition()
    {
        decimal result1 = A ?? 0 + B ?? 0;
        decimal result2 = (A ?? 0) + (B ?? 0);
        Console.WriteLine("result1: " + result1);  // = 0.11
        Console.WriteLine("result2: " + result2);  // = 0.80
    }
}

我的問題是在使用result1進行計算時會發生什么。 +和??的優先級如何? 運營商?

tinstaafl的回答是正確的。 擴展它:

?? 運算符是右關聯的+運算符的優先級更高。 因此A ?? 0 + B ?? 0 A ?? 0 + B ?? 0 A ?? 0 + B ?? 0相當於A ?? ((0 + B) ?? 0) A ?? ((0 + B) ?? 0) ,不是(A ?? 0) + (B ?? 0)

因此A ?? 0 + B ?? 0的作用 A ?? 0 + B ?? 0 A ?? 0 + B ?? 0是:

  • 計算A ,您聲明的類型為可空小數。 如果它為非null,則獲取其十進制值作為結果。 我們現在完成了; B從未計算過。
  • 編譯器已經將零轉換為十進制,並且省略了對提升算術的空檢查。 (有關詳細信息,請參閱我的系列文章,了解編譯器如何優化可空算術 。)
  • 計算B並檢查空值。 如果為null,則加法結果為null; 如果沒有,則添加的結果是可以為空的小數。
  • 現在檢查添加的結果為null。 如果為null,則結果為零(同樣,已經轉換為十進制)。 如果它不為null,則獲取其值並且該值將成為結果。

這不是你想要的行動; 你可以用(A ?? 0) + (B ?? 0)獲得你想要的動作。 如果您的意圖相反意味着“如果任何一方為空則使用零”那么你可以使用(A + B) ?? 0 (A + B) ?? 0 括號是不必要后者,但一個好主意,因為你感到困惑的優先級+ VS ??

如果沒有第一個語句中的(),你會告訴第一個? 如果A為空,則運算符返回0 + B,第二個?? 如果B為null,則運算符返回0。 因此,+運算符正被?? 運算符語句只返回A.如果將A設置為null,則返回.69

我認為更重要的是,你不應該把它留給任何人的解釋,這是一個明顯的例子,你應該總是使用括號來提高可讀性和避免懷疑。 維護是一個優先事項。

暫無
暫無

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

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