Если левый операнд оператор не равен нулю, получает ли правильный операнд?
Я смотрю на использование оператора ??
(оператор с нулевой связью) в С#. Но документация в 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";
}
}