2014-10-27 66 views
3

我碰到一些代碼,跑起來像這樣:與空初始化變量強制轉換爲變量的數據類型

List<string> list = (List<string>)null; 

是有一些原因的程序員不單單是初始化:

List<string> list = null; 

是有區別兩者之間?

這是從另一種編程語言遷移的習慣嗎?也許C,C++或Java?

+0

可能重複[投入空成東西?](http://stackoverflow.com/questions/10633946/cast-a-null-into-something) – celerno 2014-10-27 18:12:29

+1

我不同意,這不是我的問題的重複。 – 2014-10-27 18:24:06

+0

作爲答案狀態,您的代碼行沒有區別。我相信它也可能是一個重構工具的效果,一個例子可能是最初使用'var'而不是顯式類型,重構工具只是替換'var'。 – flindeberg 2014-10-27 19:16:54

回答

4

兩者有差別嗎?

不,沒有區別。

ILSpy,該行List<string> list = (List<string>)null;變爲List<string> list = null;

這是從其他編程語言遷移的習慣嗎?

不能說。可能是,早些時候有一些不同於null然後它被更改爲null

List<string> list = (List<string>) Session["List"]; 
+0

我想知道如果C/C++或Java需要鑄造null。但是我認爲他可能會用null替換一些代碼。 – 2014-10-27 18:28:23

0

不,在上述情況下,您不需要演員。你只需要像這樣的三元表達式:

return somecondition ? new List<string>() : (List<string>)null; 
+1

我認爲演員是多餘的,你可以這樣做:return somecondition?新列表():null; – evilone 2014-10-27 18:16:14

+0

我現在無法測試它,但似乎即使在您的示例演員中也沒用 – Dennis 2014-10-27 18:18:08

+1

評論者是正確的,您不需要投射,您可以從返回列表的方法返回null。 – 2014-10-27 18:21:15

1

這兩行代碼沒有區別。這是我想到的味道問題。雖然如果你使用鑄造,你可以從你的變量中刪除類型,如下所示:

var list = (List<string>)null; 

沒有鑄造,你不能這樣做。

+0

我不明白。爲什麼要使用'var'關鍵字,然後將其轉換爲您想要首先定義的類型? – 2014-10-27 18:40:22

+0

嗯,這是一種可能性:)我也猜測味道的問題。我寧願列表 list = null;我。 – evilone 2014-10-27 18:42:27

2

在這種情況下,沒有實際區別,並且兩個賦值都將編譯到完全相同的MSIL操作碼。 但是,有一種情況下,施放空值確實有差異,那就是在調用重載方法時。

class A { } 
class B { } 

class C 
{ 
    public static void Foo(A value); 
    public static void Foo(B value); 
} 

簡單地調用C.Foo(null);是模糊的,而編譯器不能推理,你打算調用,但如果你先施放空:C.Foo((A)null);,這是現在很清楚,你的意思是叫第一過載,但將它傳遞給null而不是A的實例。