2012-12-13 27 views
0

非常簡單的問題 - 而在C#以下是可能的:在相等操作中聲明變量可能嗎?

var a = new []{"hello"}; 
string[] b; 
if ((b=a)!=null) { ... } 

下面是不是:

var a = new []{"hello"}; 
if ((string[] b=a)!=null) { ... } 

只是想確認我不是沿着做錯什麼在第二個例子中有什麼東西這些線是不可能的。 (類似於第二個例子中的方面可能是using()內部的可能性

+0

「不可能」,你的意思是不會編譯或拋出異常 – Jodrell

回答

2

這是不可能的,因爲在c#中變量聲明是'語句',而不是表達式,因此語句不會產生一個值,因此I不要認爲你可以在表達式中使用它

但是,在 第二個 第一種形式中使用的賦值是一個「表達式」,它產生一個結果(在此情況下爲a的值),它可以是用於與運算符的另一個表達式

更多上下文來自MSDN

它特別提到:

聲明聲明聲明局部變量或常量。 聲明語句允許在塊中,但不允許 作爲嵌入語句。

所以它看起來更像是'語言限制'而不是'缺乏返回值',儘管(缺少語句的返回值)必定影響了這種限制。

1

是的,正確的,你不能這樣做。

原因很簡單,這個變量的聲明不能條件語句的一部分,還因爲,即使它會成爲可能,variable將被分配任一條件進行驗證,以true或驗證到false。檢查IL,你會看到。

所以從這清晰易懂的代碼點,這是正確的,從編碼器假裝寫

string[] b; 
if ((b=a)!=null) { ... } 
+0

對於清晰的代碼,我更喜歡'string [] b = a; if(b!= null)...'這樣'if'條件沒有副作用。 – CodesInChaos

+0

@CodesInChaos:這個背後討論,因爲我也可以調用內部條件檢查中的計算,調用一個函數,但是*至少聲明*編譯器*可以*強制我推出,其餘都是測試的問題。 。 – Tigran

1

等待,

爲了簡化你的問題。

你可以做,

var a = 0; 
var b = 1; 
var c = a = b; 

,但你不能這樣做,

var x = 0; 
var x = var y = 1; 

這似乎是顯而易見。

值的賦值返回賦值。變量的實例化或初始化不會。

但是,你可以暗指我們可以在塊聲明中實例化的情況。

using(var x = new SomeIDisposable(... 

foreach(var y in SomeIEnumerable... 

當然還有其他的。這些本質上是句法糖。 C#的設計者已經破壞了它的語義純度,使它更易於使用。我想他們一般都沒有這樣做,對於所有的實例,因爲他們認爲這會導致代碼混亂。

相關問題