C# 是否可以在相等操作中声明变量?

C# 是否可以在相等操作中声明变量?,c#,C#,非常快速的问题-虽然在C#中可能出现以下情况: 以下不是: var a = new []{"hello"}; if ((string[] b=a)!=null) { ... } 我只是想确认我在第二个例子中没有做错任何事情,而且沿着这些思路是不可能的。(以类似的方式,第二个示例中的方面可能在using()中,这是不可能的,因为在c#中,变量声明是一个“语句”,而不是一个表达式。语句不会产生值,因此我认为您不能在表达式中使用它 但是,您在第二种形式中使用的赋值是一个“表达式”,它生成一个结果(在

非常快速的问题-虽然在C#中可能出现以下情况:

以下不是:

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

我只是想确认我在第二个例子中没有做错任何事情,而且沿着这些思路是不可能的。(以类似的方式,第二个示例中的方面可能在
using()

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

但是,您在第二种形式中使用的赋值是一个“表达式”,它生成一个结果(在本例中为a的值),可以在另一个表达式中使用运算符

更多上下文来自

它具体提到:

声明语句声明局部变量或常量。 允许在块中使用声明语句,但不允许使用 作为嵌入式语句


因此,它看起来更像是一种“语言限制”,而不是“缺少返回值”,尽管(缺少语句的返回值)一定影响了这样的限制。

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

但是,您在第二种形式中使用的赋值是一个“表达式”,它生成一个结果(在本例中为a的值),可以在另一个表达式中使用运算符

更多上下文来自

它具体提到:

声明语句声明局部变量或常量。 允许在块中使用声明语句,但不允许使用 作为嵌入式语句

因此,它看起来更像是一种“语言限制”,而不是“缺少返回值”,尽管这(缺少语句的返回值)一定影响了这种限制。

是的,正确,你不能这样做

原因很简单,变量的声明不能成为条件语句的一部分,还因为,即使可能,
变量
也将被分配到条件validate to
true
或validates to
false
。检查
IL
,您将看到

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

string[] b;
if ((b=a)!=null) { ... }
是的,没错,你不能那样做

原因很简单,变量的声明不能成为条件语句的一部分,还因为,即使可能,
变量
也将被分配到条件validate to
true
或validates to
false
。检查
IL
,您将看到

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

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

为了简化你的问题

你可以

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

等等

为了简化你的问题

你可以

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#的设计者破坏了它的语义纯度,使它更易于使用。我想他们一般不会对所有的实例这样做,因为在他们看来,这会导致混乱的代码。

你说的“不可能”,是指不会编译还是抛出异常“不可能”,您的意思是不会编译,还是抛出一个异常以清除代码我更喜欢
string[]b=a;如果(b!=null)…
这样,
if
条件就没有副作用了。@CodesInChaos:这是后面的讨论,因为我也可以调用条件检查中的计算,调用函数,但至少编译器上的声明可以强制我输出,剩下的是测试问题……对于清晰的代码,我更喜欢
字符串[]b=a;if(b!=null)“…
这样,
如果
条件没有副作用。@CodesInChaos:这是讨论的后面,因为我也可以调用条件检查中的计算,调用函数,但至少编译器上的声明可以强制我输出,剩下的是测试问题…”。。。