2012-12-13 22 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#的设计者已经破坏了它的语义纯度,使它更易于使用。我想他们一般都没有这样做,对于所有的实例,因为他们认为这会导致代码混乱。

相关问题