熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

也談值類型與null的判等比較

2022-06-13   來源: .NET編程 

  首先我們回顧一下代碼(這裡根據需要做了簡化)

   using System;

  

   namespace StructOperatorDemo

   {

       class Program

       {

           struct MyStruct

           {

               public int Value;

  

               public MyStruct(int fValue)

               {

                   thisValue = fValue;

               }

  

               public static bool operator !=(MyStruct s MyStruct s)

               {

                   return sValue != sValue;

               }

               public static bool operator ==(MyStruct s MyStruct s)

               {

                   return sValue == sValue;

               }

           }

  

           static void Main(string[] args)

           {

               MyStruct myStruct = new MyStruct();

  

               if (myStruct == null)

               {

                   ConsoleWriteLine(OMG that is impossible!);

               }

           }

       }

   }

  之前的代碼用Net以及之後的編譯器可以編譯通過但是 之前的編譯器去編譯是無法通過的它會明確告示你struct不能跟null比較這是什麼原因呢?

  我們再看看這段代碼

   int x = ;

  

   if (x == )

   {

       ConsoleWriteLine(Emmm I think it is not possible);

   }

  就這段代碼而言雖然int 本身並不包含對double類型判等比較的重載但無論是新的還是老的Net編譯器都可以編譯通過(當然還有加上相關必要的代碼)因為編譯器在編譯時會將x和轉換成double 來進行比較對了編譯器自己會做隱式轉換

  所以第一段代碼到了Net就可以編譯通過因為二者都可以被轉換成MyStruct?進行比較而在Net 之前編譯器還不知道什麼是Nullable Type呢!

  當然編譯器還做了別的優化比如例子中的情況根本不可能返回true那麼編譯器直接忽略隨後的相關代碼

  就象周雪峰同學總結的那樣這不是一個bug而是故意設計的而真相則是對Nullable Type隱式轉換的一個延伸雖然struct == null不可能發生但是它是合法的 : )


From:http://tw.wingwit.com/Article/program/net/201311/13887.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.