亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#可以將值類型與NULL進行比較

C#可以將值類型與NULL進行比較

C#
江戶川亂折騰 2019-07-17 16:13:59
C#可以將值類型與NULL進行比較我今天遇到了這種情況,不知道為什么C#編譯器沒有拋出錯誤。Int32 x = 1;if (x == null){     Console.WriteLine("What the?");}我搞不懂x怎么可能是空的。特別是由于此賦值肯定會引發編譯器錯誤:Int32 x = null;是否有可能x會變成NULL,微軟只是決定不把這個檢查放入編譯器中,還是完全錯過了呢?更新:在修改了編寫本文的代碼之后,編譯器突然想到了一個警告,即該表達式不可能為真?,F在我真的迷路了。我將對象放入類中,現在警告已經消失,但留下了一個問題,值類型最終是否為NULL?public class Test{     public DateTime ADate = DateTime.Now;     public Test ()     {         Test test = new Test();         if (test.ADate == null)         {             Console.WriteLine("What the?");         }     }}
查看完整描述

3 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

這是合法的,因為操作符重載解析有唯一的最佳運算符可供選擇。有一個=操作符,它接受兩個可空的INT。int local可轉換為可空int??瘴谋究赊D換為可空的int。因此,這是=操作符的合法用法,并且總是導致false。

同樣,我們還允許您說“if(x=12.6)”,這也總是false。INT局部可轉換為雙,文字可轉換為雙,顯然它們永遠不會相等。


查看完整回答
反對 回復 2019-07-17
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

這不是一個錯誤,因為有一個(int?)轉換;它確實在給出的示例中生成警告:

表達式的結果總是‘false’,因為‘int’類型的值永遠不等于‘int’類型的‘null’?

如果你檢查IL,你會發現完全地移除無法到達的分支-它在發布版本中不存在。

不過,請注意為帶有相等運算符的自定義結構生成此警告。它曾用于2.0,但在3.0編譯器中則不然。代碼仍然被刪除(因此它知道代碼是不可訪問的),但是不會生成警告:

using System;struct MyValue{
    private readonly int value;
    public MyValue(int value) { this.value = value; }
    public static bool operator ==(MyValue x, MyValue y) {
        return x.value == y.value;
    }
    public static bool operator !=(MyValue x, MyValue y) {
        return x.value != y.value;
    }}class Program{
    static void Main()
    {
        int i = 1;
        MyValue v = new MyValue(1);
        if (i == null) { Console.WriteLine("a"); } // warning
        if (v == null) { Console.WriteLine("a"); } // no warning
    }}

與IL(用于Main)-注一切除了MyValue(1)(可能有副作用)已被移除:

.method private hidebysig static void Main() cil managed{
    .entrypoint    .maxstack 2
    .locals init (
        [0] int32 i,
        [1] valuetype MyValue v)
    L_0000: ldc.i4.1 
    L_0001: stloc.0 
    L_0002: ldloca.s v
    L_0004: ldc.i4.1 
    L_0005: call instance void MyValue::.ctor(int32)
    L_000a: ret 
}

這基本上是:

private static void Main(){
    MyValue v = new MyValue(1);}


查看完整回答
反對 回復 2019-07-17
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

不,Int32 x永遠不會變成null.

如果您將一個int與NULL進行比較,那么使用兩個int?s的比較操作符是適用的。


查看完整回答
反對 回復 2019-07-17
  • 3 回答
  • 0 關注
  • 1443 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號