首先我們回顧一下代碼(這裡根據需要做了簡化)
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