簡體   English   中英

C# null - 它是 object

[英]C# null - is it an object

幾天前,當我編寫 C# 代碼時,我注意到編譯器抱怨我必須將null轉換為特定的 object。

這是否意味着 null 只是該類型的未實例化版本? 還是像 ZD52387880E1EA22817A72D37592 一樣是Null class 的 singleton 值?

編輯:給出錯誤的代碼示例是:

public String duplicate(String toDuplicate)
{
    return toDuplicate + toDuplicate;
}

public String duplicate(int? toDuplicate)
{
    String asString = toDuplicate.toString();

    return asString + asString;
}

public static int Main(string[] args)
{
    //This needs to be cast:
    duplicate(null);
    //To:
    duplicate((string)null);
}

我在null中評論 null 的原因是在閱讀此內容后:

還有一個特殊的null類型,表達式null的類型,沒有名字。 由於 null 類型沒有名稱,因此無法聲明 null 類型的變量或強制轉換為 null 類型。 null 引用是 null 類型表達式的唯一可能值。 null 引用始終可以轉換為任何引用類型。 在實踐中,程序員可以忽略 null 類型,只是假裝 null 只是一個可以是任何引用類型的特殊文字。

在這里找到: null 是 Object 嗎?

當我有重載方法並且編譯器無法解析在編譯時調用哪個方法時,我會收到您提到的錯誤。 是這樣嗎?

根據MSDN 描述

null 關鍵字是表示 null 引用的文字,它不引用任何 object。 null 是引用類型變量的默認值。 普通值類型不能為 null。 但是,C# 2.0 引入了可空值類型。

null是任何類型的“未實例化參考”。 它不是一個值。 null沒有定義類型。

不,它不是 object。 null 是引用類型變量的默認值。 普通值類型不能為 null。 但是還有另一組稱為可空類型。

否 - null 只是 null 參考的文字。

您需要以這種方式“轉換”它的原因(我將單詞 cast 放在引號中,因為您並沒有真正轉換任何實例),純粹是為了幫助編譯器解決您正在調用的方法的哪個重載,或者您調用的方法甚至存在。

在您的示例中,您需要指定您正在調用采用單個字符串參數的方法“duplicate”。 如果您省略強制轉換,那么編譯器只知道您打算調用的方法稱為“重復”並且只有一個參數,但無法判斷參數是什么類型 - 您是要調用duplicate(string)還是你的意思是叫duplicate(some other type)嗎? 它應該編譯,還是應該錯誤地告訴您您嘗試調用的方法不存在?

如果您定義了 duplicate(byte[]),您也會遇到同樣的問題,因為現在您的調用在沒有顯式轉換的情況下是模棱兩可的。

您可能指的是以下導致編譯器錯誤的事實:

int? nullableInt = (somecondition) ? value : null;

確實,您需要在此處添加演員表:

int? nullableInt = (somecondition) ? value : (int?)null;

盡管我無法詳細解釋這一點,但我懷疑以下幾點:

int? 實際上是Nullable<int>的縮寫形式,因此它基本上是一個 object 實例。 int值分配給nullableInt時,將在內部設置Nullable<int>的屬性。 直接分配null也可以。

然而,條件賦值將返回兩種不同的類型:如果someconditiontrue ,則返回int ,否則object ( null )。

現在編譯器不知道如何處理這個問題,因為三元運算符需要返回相同類型的值。 因此,您需要指定所需的“ null值的類型”。

抱歉,如果這不是一個非常深入的技術解釋 - 我相信有人可以更好地闡述這一點,但這可能有助於更好地理解這一點。

暫無
暫無

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

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