好的,这对你们中的一些人来说可能很明显,但我对我从这个相当简单的代码中得到的行为感到困惑:
public static void Main(string[] args)
{
int? n = 1;
int i = 1;
n = ++n - --i;
Console.WriteLine("Without Nullable<int> n = {0}", n); //outputs n = 2
n = 1;
i = 1;
n = ++n - new Nullable<int>(--i);
Console.WriteLine("With Nullable<int> n = {0}", n); //outputs n = 3
Console.ReadKey();
}
我期望两个输出相同且等于,2
但奇怪的是它们并非如此。有人可以解释为什么吗?
编辑:虽然生成这种“奇怪”行为的代码是人为设计的,但它看起来确实像 C# 编译器中的一个错误,尽管看起来并不重要,原因似乎是new
James最初指出的内联。但行为不限于操作。方法调用的行为方式完全相同,也就是说,当它们只应该被调用一次时,它们被调用了两次。
考虑以下重现:
public static void Main()
{
int? n = 1;
int i = 1;
n = n - new Nullable<int>(sideEffect(ref i));
Console.WriteLine("With Nullable<int> n = {0}", n);
Console.ReadKey();
}
private static int sideEffect(ref int i)
{
Console.WriteLine("sideEffect({0}) called", i);
return --i;
}
果然,输出是2
应该的1
,并且"sideEffect(i) called"
被打印了两次。