C#Console.WriteLine很奇怪

时间:2018-05-25 14:22:42

标签: c# visual-studio

这是C#中的一个简单脚本,它输出两个不同的东西。问题不在于比较对象 - 不要误入歧途。这是关于使用Console.WriteLine发送输出。

var a = "hello";
var b = string.Copy(a);

Console.WriteLine($"a == b: {a == b}");
Console.WriteLine("a == b:" + a == b);

第一个Console.WriteLine输出a == b: True,第二个输出False,这意味着忽略引号中的部分("a == b:")。

我正在使用VS 2015和C#4.5.2 - 使用4.6测试结果仍然相同。

对这种行为的任何想法都非常感激。

3 个答案:

答案 0 :(得分:8)

==运算符的优先级低于+运算符。这意味着第一个"a == b:"+连接在一起(a),然后将结果与==b进行比较,返回False

请参阅:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/

添加运算符高于相等运算符,因此它们具有更高的优先级。

您可以使用()强制它,在以下代码中a == b首先进行评估:

Console.WriteLine("a == b:" + (a == b));

您的第一个示例是使用字符串插值,其中在调用ToString之前计算整个表达式,然后将结果与其余表达式连接。

答案 1 :(得分:6)

第二行正在评估:

"a == b:" + a == b

正确返回False。即。

( "a == b:" + a ) == b

因此字符串构建为a == b:hello' and being compared to 'hello' as the + operation is done before the ==`

您可以通过在a == b

周围加上括号来解决此问题
Console.WriteLine("a == b:" + (a == b));

答案 2 :(得分:0)

你的第二行是'字符串文字+ a' == b,这将是假的。从本质上讲,你正在做

"a == b:hello" == b

总是会返回false。