2017-01-22 80 views
0

C#枚舉比較時沒有得到編譯錯誤爲const int使用equals

class ConstValues 
{ 
    public const int NULL=1; 
} 

class Example 
{ 
    private enum FormatFunction 
    { 
     Date, 
     Unknown 
    } 

    ... 

    FormatFunction returnValue = fn(); 

    ... 

現在我有兩個場景。

當我用這樣的方式我返回代碼比較值

if (!returnValue.Equals(ConstValues.NULL)) 
{ 
    ... 

我沒有得到任何編譯時錯誤(和預期的代碼不工作,因爲這是我錯過了我的一個錯誤)。

但是,當我改變

if (returnValue != ConstValues.NULL) 
{ 
    ... 

我得到一個編譯時錯誤,發現錯誤我做到了。

我知道枚舉的底層結構是int,但即使在使用Equals時我寧願得到編譯時錯誤。

爲什麼第一種方式通過,第二種方式不通過?

+0

還有一種方法Enum.IsDefined我認爲它可能對你有用。 https://msdn.microsoft.com/en-us/library/system.enum.isdefined(v=vs.110).aspx –

回答

2

!=是一種語言約定,所以這是C#特有的。調用這個操作符是早期的,換句話說,它會在編譯時發生。

Equals是一個框架約定,在這種情況下.NET,並在運行時綁定。

當您調用!=時,C#編譯器在編譯期間做出決定,因此會出現錯誤。當您致電Equals時,框架會在運行時作出決定。由於你的enum不是類型對象,所以它會變成一個對象(裝箱),然後運行庫會檢查你的類型是否覆蓋了方法,因爲你沒有,它會使用默認的實現。


Equals爲參考值類型

如果實例是參考類型,Equals檢查默認實現,如果一個對象引用是一樣的其它對象引用。如果它們是相同的參考,則返回true。否則它返回false。


Equals爲值類型

如果實例是值類型,那麼它將測試值相等。這是你的情況。它會檢查你的枚舉值是否等於常量值。不會顯示或拋出錯誤:它可以是等於或不等於。

+0

這兩個答案几乎相同,但這一個更「針對我的基本水平「所以我穿過這個。但是,所有! – paseg

3

這是因爲默認虛擬Equals方法正在接收對象代替強類型值等在第二示例。它被裝入對象中,並僅在運行時檢查類型。

爲什麼這樣做?推理非常有趣 - 可以比較貓和狗如果四肢走路。比較兩個完全不同的對象的幾個相同的屬性。

事情是,當你可以 - 與強類型對象一起工作。這將防止在編譯時發生壞事。

相關問題