Делает С#?? короткое замыкание оператора?

При использовании оператора ?? в С# выполняется ли короткое замыкание, если тестируемое значение не является нулевым?

Пример:

string test = null;
string test2 = test ?? "Default";

string test3 = test2 ?? test.ToLower();

Ли строка test3 претерпевает успешное выполнение или выбрасывает исключение ссылочной ссылки?

Итак, еще один способ сформулировать вопрос: будет ли правильное выражение? оператор получает оценку, если левая рука не равна нулю?

Ответ 1

Да, он говорит об этом в Спецификации языка С# (выделение мной):

Нулевое коалесцирующее выражение формы a ?? b требует, чтобы a имел тип NULL или ссылочный тип. Если a не является нулевым, результатом a ?? b является a; в противном случае результат b. Операция оценивает b только в том случае, если a имеет значение null.

Ответ 2

Да, это короткие замыкания.

class Program
{
    public static void Main()
    {
        string s = null;
        string s2 = "Hi";
        Console.WriteLine(s2 ?? s.ToString());
    }
}

Вышеупомянутая программа выводит "Привет", а не бросает NullReferenceException.

Ответ 3

Да.

    public Form1()
    {
        string string1 = "test" ?? test();
        MessageBox.Show(string1);
    }

    private string test()
    {
        MessageBox.Show("does not short circuit");
        return "test";
    }

Если это не короткое замыкание, будет вызван test(), и окно сообщения покажет, что оно "не замыкается".