C# 中的 'If' 条件应该是这样的吗?

Is the 'If' condition in C# supposed to behave like this?

我相信在 if 条件的谓词中执行赋值操作总是会得到 true(在 C# 和任何其他语言中)。但是,当我尝试这样的事情时并没有发生这种情况(注意我只是在 If 条件中使用单个等于):

class Program
    {
        static void Foo()
        {
            bool someVar = false;
            if (someVar = true)
                System.Diagnostics.Debug.WriteLine("This gets printed");  // as expected
        }

        static void Bar()
        {
            bool someVar = false;
            if (someVar = false)
                System.Diagnostics.Debug.WriteLine("This DOES NOT get printed");  // I exected this to be printed as well as it
        }

        static void Main(string[] args)
        {
            Foo();
            Bar();
        }
    }

谁能解释一下?是不是因为变量 someVar 被赋予了一个假值,它没有进入 if 条件?

您提供的代码符合预期: if (someVar = false) 表示你将 false 赋值给 someVar 所以最终结果是 if(false) 不符合条件。

因为 (someVar = false) 的 return 值将是 false

不能使用赋值运算符作为条件; equals 与 double equals 不同!如果您正在评估条件,则必须使用双等号进行比较。给定 foo 是一个 bool 变量,这: foo = true; 是一个赋值。它 foo 的值 赋值给 true。这: (foo == true) 不是赋值;相反,它是一个比较。它将return当前是否foo的bool值赋值为true;如果是这样,它将 return true,否则它将 return false.

你在这里的陈述中发生的事情是,你在 if() 条件中使用比较,而不是在其中放入一个变量。通常这不是问题,我可以创建 foo然后有一个以 foo 作为条件的 if() 语句,它将检查 foo 是真还是假。但是,您将变量传递给语句 ,同时将其赋值给一个值 。这就是为什么 foo 按照您的设置将始终打印语句,而 bar 始终不会。您所做的相当于将 foo 设置为 true 并对其进行评估,同样将 bar 设置为 false 并对其进行评估那。 :)

换句话说,这个:

bool bar = true;
if(bar = false) {
     doSomething;
}

与这样做是一样的:

bool bar = true;
bar = false;
if(bar) {
     doSomething;
}

因此代码永远不会 doSomething 因为 bar 总是首先设置为 false。