Если левый операнд оператор не равен нулю, получает ли правильный операнд?

Я смотрю на использование оператора ?? (оператор с нулевой связью) в С#. Но документация в MSDN ограничена.

Мой вопрос: Если левый операнд не равен нулю, обрабатывается ли правый операнд?

Ответы

Ответ 1

Как всегда, спецификация С# - лучшее место для такого рода вещей.

Из раздела 7.13 спецификации С# 5 (выделено мной):

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

Есть более подробные сведения о том, когда совершаются какие-либо преобразования, и точное поведение, но главное, что вы задали. Также стоит отметить, что оператор с нулевым коалесцированием является право-ассоциативным, поэтому a ?? b ?? c оценивается как a ?? (b ?? c)... что означает, что он будет оценивать только c, если оба a и b равны нулю.

Ответ 2

Почему бы не протестировать его:)

void Main()
{
    var leftOrRight = left ?? right;
}

public bool? left 
{
    get
    {
        Console.WriteLine ("Left hit");
        return true;
    }
}

public bool right 
{
    get
    {
        Console.WriteLine ("Right hit");
        return true;
    }   
}

И ответ на вопрос no... Второе значение не оценивается

Ответ 3

Из спецификации:

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

(добавлен акцент)

Ответ 4

Проверьте это. Если имя не равно null, консоль показывает "MyName". Если он пуст, консоль показывает "Вызывается", а затем "Алло"

using System;           
public class Program
{
    public static void Main()
    {
        string name = "MyName";

        Console.WriteLine(name??test());
    }

    private static string test()
    {
        Console.WriteLine("Called");
        return "Allo";
    }
}