0

非常快速的问题 - 虽然在 C# 中可以执行以下操作:

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

以下不是:

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

只是想确认我在第二个示例中没有做错任何事情,并且不可能发生类似的事情。(以类似的方式,第二个示例中的方面可能在using().

4

3 回答 3

2

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

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

更多来自MSDN的上下文。

它特别提到:

声明语句声明一个局部变量或常量。块中允许声明语句,但不允许作为嵌入语句。

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

于 2012-12-13T10:50:43.767 回答
1

是的,正确的,你不能那样做。

原因很简单,变量的声明不能是条件语句的一部分,也因为即使有可能,variable也将分配条件 validate totrue或 validates to false。检查一个IL,你会看到。

所以从清晰易懂的代码来看,假装从coder来写是对的

string[] b;
if ((b=a)!=null) { ... }
于 2012-12-13T10:51:57.273 回答
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# 的设计者破坏了它的语义纯度,使其更易于使用。我认为他们通常没有对所有实例执行此操作,因为在他们看来,这会导致代码混乱。

于 2012-12-13T11:10:43.410 回答