わかりました、これは一部の人にとっては明らかかもしれませんが、私はこのかなり単純なコードから得ている動作に困惑しています:
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# コンパイラのバグのように見えます。その理由は、James が最初に指摘したようにインライン化new
されているようです。しかし、動作は操作に限定されません。メソッド呼び出しはまったく同じように動作します。つまり、1 回だけ呼び出されるはずのメソッドが 2 回呼び出されます。
次の再現を検討してください。
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"
2 回出力されます。