好吧,对于你们中的一些人来说这可能是显而易见的,但我对这个相当简单的代码所得到的行为感到难过:
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为詹姆斯最初指出.但行为不仅限于运营.方法调用的行为方式完全相同,也就是说,当它们只应被调用一次时,它们被调用两次.
考虑以下repro:
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"打印出来的两倍.
the*_*oop 20
编辑:这已被团队确认为编译器中的错误.它在罗斯林修复.作为一种解决方法,使用强制转换(int?)(--i)来阻止出现错误,或者不Nullable<int>首先将其明确地转换为a .
第一个代码块在反射器中生成以下内容:
int? nullable3;
int? nullable = 1;
int num = 1;
int? nullable2 = nullable;
nullable2 = nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault() + 1)    
   : ((int?) (nullable3 = null));
int num2 = --num;
nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault() - num2)
    : ((int?) (nullable3 = null));
Console.WriteLine("Without Nullable<int> n = {0}", nullable);
第二个如下:
nullable = 1;
num = 1;
nullable2 = nullable;
nullable2 = nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault() + 1)
    : ((int?) (nullable3 = null));
num2 = --num;
nullable = nullable2.HasValue
    ? new int?(nullable2.GetValueOrDefault() - --num)
    : null;
Console.WriteLine("With Nullable<int> n = {0}", nullable);
他们或多或少都是一样的,直到任务nullable.它正在运行--num两次,导致它运行2 - -1,结果为3.
对于像表达式这样的表达式也是如此i = ~i,但是方法调用表达式也没有...
| 归档时间: | 
 | 
| 查看次数: | 760 次 | 
| 最近记录: |