非常快速的问题 - 虽然在 C# 中可以执行以下操作:
var a = new []{"hello"};
string[] b;
if ((b=a)!=null) { ... }
以下不是:
var a = new []{"hello"};
if ((string[] b=a)!=null) { ... }
只是想确认我在第二个示例中没有做错任何事情,并且不可能发生类似的事情。(以类似的方式,第二个示例中的方面可能在using()
.
非常快速的问题 - 虽然在 C# 中可以执行以下操作:
var a = new []{"hello"};
string[] b;
if ((b=a)!=null) { ... }
以下不是:
var a = new []{"hello"};
if ((string[] b=a)!=null) { ... }
只是想确认我在第二个示例中没有做错任何事情,并且不可能发生类似的事情。(以类似的方式,第二个示例中的方面可能在using()
.
这是不可能的,因为在 c# 中,变量声明是“语句”,而不是表达式。语句不会产生值,因此我认为您不能在表达式中使用它。
但是您在第二种第一种形式中使用的赋值是一个“表达式”,它产生一个结果(在这种情况下是 a 的值),它可以在另一个带有运算符的表达式中使用。
更多来自MSDN的上下文。
它特别提到:
声明语句声明一个局部变量或常量。块中允许声明语句,但不允许作为嵌入语句。
因此,它看起来更像是“语言限制”而不是“缺少返回值”,尽管那(缺少语句的返回值)一定影响了这种限制。
是的,正确的,你不能那样做。
原因很简单,变量的声明不能是条件语句的一部分,也因为即使有可能,variable
也将分配条件 validate totrue
或 validates to false
。检查一个IL
,你会看到。
所以从清晰易懂的代码来看,假装从coder来写是对的
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# 的设计者破坏了它的语义纯度,使其更易于使用。我认为他们通常没有对所有实例执行此操作,因为在他们看来,这会导致代码混乱。