Хорошо, это может быть очевидно для некоторых из вас, но я в тупике с поведением, которое я получаю от этого довольно простого кода:
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
, но, как ни странно, они не являются. Может кто-нибудь объяснить, почему?
РЕДАКТИРОВАТЬ: Хотя код для создания этого "странного" поведения, по общему признанию, был надуман, он выглядит как ошибка в компиляторе С#, хотя, казалось бы, неважно, и причина, по-видимому, является встроенной 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"
распечатан дважды.