可以在相等操作中声明变量吗?

时间:2012-12-13 10:45:16

标签: c#

非常快速的问题 - 虽然C#中可以使用以下内容:

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

以下不是:

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

只是想确认我在第二个例子中没有做错任何事情,并且这些行中的某些内容是不可能的。 (以类似的方式,第二个示例中的方面可能在using()内部。

3 个答案:

答案 0 :(得分:2)

这是不可能的,因为在c#中,变量声明是一个'语句',而不是表达式。语句不会产生值,因此我认为您不能在表达式中使用它。

但是你在 second 第一种形式中使用的赋值是一个'表达式',它产生一个结果(在这种情况下是a的值),它可以在另一个带有运算符的表达式中使用

来自MSDN的更多背景信息。

具体提到:

  

声明语句声明一个局部变量或常量。   声明语句允许以块为单位,但不允许   作为嵌入式陈述。

所以它看起来更像是'语言限制',而不是“缺乏回报价值”,尽管(缺乏报表的返回值)必然会影响这种限制。

答案 1 :(得分:1)

是的,没错,你不能这样做。

原因很简单,变量的声明不能是条件语句的一部分,也因为,即使可能,{{1 }}将被分配条件验证到variable或验证到true。检查false,您会看到。

因此,从清晰易懂的代码角度来看,编写假装是正确的

IL

答案 2 :(得分: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#的设计者破坏了它的语义纯度,使其更易于使用。对于所有实例化,我认为他们没有做到这一点,因为在他们看来,它会导致代码混乱。