2

嗨,我们不能像这样在 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

4 回答 4

2

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

if (var t = true) {}

bool t;
if (t = true) {}

bool t;
if (t == true) {}
于 2012-08-02T13:40:50.177 回答
2

至于为什么,这是因为input = db.table.FirstOrDefault()是一个声明,实际上并没有返回任何东西。它为变量分配了一些东西。input因为它不返回任何东西(即它是一个语句),所以你不能将它与其他东西进行比较。

if期望一个表达式返回一些东西的东西)。这里有更多关于statements 和 expressions 之间的区别

这与 C 不同,其中(如果我没记错的话)所有值为 0 的 iffalse和其他所有内容都是true.

至于您可以使用 C# 获得的最接近的结果,我相信您可以执行以下操作:

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

但是你也可以这样做:

MyClass input = db.table.FirstOrDefault();
if (input != null)
{
    // use input here
}
于 2012-08-02T13:43:23.827 回答
2

这是因为写

object input = db.table.FirstOrDefault();

和写作一模一样

object input; 
input = db.table.FirstOrDefault();

根据 C# 规范。

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

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

于 2012-08-02T13:45:05.920 回答
0

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

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

但在这种情况下,i变量将存在于迭代之外,因此for循环创建具有迭代范围的变量。在一个if你不需要额外的变量来工作。

于 2012-08-02T13:44:41.610 回答