您好,我们无法像这样定义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做的话,那不是很好吗?
答案 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
中,您无需其他变量即可使用。