if中的初始化变量

时间:2012-08-02 13:37:05

标签: c# variables initialization

您好,我们无法像这样定义c#变量

if((var input = db.table.FirstOrDefault()) != null)
{
   // and here I could use my 'input' variable
}

但我可以这样做

for(var input = db.table.FirstOrDefault(); input != null; input = null)
{
  //opeartion

}

谁能告诉我为什么?如果我们能用if做的话,那不是很好吗?

4 个答案:

答案 0 :(得分:2)

因为这导致了众所周知的难以追踪的错误:

if (var t = true) {}

bool t;
if (t = true) {}

bool t;
if (t == true) {}

答案 1 :(得分:2)

至于原因,这是因为input = db.table.FirstOrDefault()是一个语句并且实际上并没有返回任何内容。 input变量分配内容。因为它没有返回任何东西(即它是一个声明),你无法将它与其他东西进行比较。

if需要表达式返回某事物)。这里有更多关于the difference between statements and expressions

这与C不同(如果我没记错),如果false且其他所有内容都为true,则值为0的所有内容。

至于你能用C#获得的最接近的,我相信你可以这样做:

MyClass input = null;
if ((input = db.table.FirstOrDefault()) != null)
{
    // use input here
}

但是你不妨这样做:

MyClass input = db.table.FirstOrDefault();
if (input != null)
{
    // use input here
}

答案 2 :(得分:2)

这是因为写作

object input = db.table.FirstOrDefault();

与编写

完全相同
object input; 
input = db.table.FirstOrDefault();

符合C#规范。

这意味着没有任何返回值,因此无需检查!=null

是的,我认为可以欺骗这一点,在编译器中进行一些更改,但可能不值得努力。

答案 3 :(得分:0)

在for循环中,您可以为迭代定义索引变量。你可以这样写:

var i = 0;
for (; i < x; ++i)
{
    // Some code;
}

但在这种情况下,i变量将存在于迭代之外,因此for循环创建具有迭代范围的变量。在if中,您无需其他变量即可使用。