非常快速的问题 - 虽然C#中可以使用以下内容:
var a = new []{"hello"};
string[] b;
if ((b=a)!=null) { ... }
以下不是:
var a = new []{"hello"};
if ((string[] b=a)!=null) { ... }
只是想确认我在第二个例子中没有做错任何事情,并且这些行中的某些内容是不可能的。 (以类似的方式,第二个示例中的方面可能在using()
内部。
答案 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#的设计者破坏了它的语义纯度,使其更易于使用。对于所有实例化,我认为他们没有做到这一点,因为在他们看来,它会导致代码混乱。