Ответ 1
Спектр на самом деле является самопротиворечивым на этом.
В разделе 7.13 спецификации С# 4 указано:
Оператор нулевой коалесценции является право-ассоциативным, что означает, что операции группируются справа налево. Например, выражение формы
a ?? b ?? c
оценивается какa ?? (b ?? c)
.
С другой стороны, как было указано, 7.3.1 утверждает, что:
За исключением операторов присваивания, все бинарные операторы лево-ассоциативны
Я полностью согласен с тем, что для простых случаев не имеет значения, как вы выполняете группировку... но могут быть случаи, когда это действительно имеет значение из-за неявного преобразования типов, делая интересные вещи, если операнды имеют разные типы.
Я рассмотрю это дальше, пинг Mads и Eric, и добавлю ошибку для соответствующего раздела С# в Depth (который вдохновил этот вопрос).
EDIT: Хорошо, теперь у меня есть пример, где это имеет значение... и нулевой коалесцирующий оператор определенно право-ассоциативный, по крайней мере, в компиляторе MS С# 4. Код:
using System;
public struct Foo
{
public static implicit operator Bar(Foo input)
{
Console.WriteLine("Foo to Bar");
return new Bar();
}
public static implicit operator Baz(Foo input)
{
Console.WriteLine("Foo to Baz");
return new Baz();
}
}
public struct Bar
{
public static implicit operator Baz(Bar input)
{
Console.WriteLine("Bar to Baz");
return new Baz();
}
}
public struct Baz
{
}
class Test
{
static void Main()
{
Foo? x = new Foo();
Bar? y = new Bar();
Baz? z = new Baz();
Console.WriteLine("Unbracketed:");
Baz? a = x ?? y ?? z;
Console.WriteLine("Grouped to the left:");
Baz? b = (x ?? y) ?? z;
Console.WriteLine("Grouped to the right:");
Baz? c = x ?? (y ?? z);
}
}
Вывод:
Unbracketed:
Foo to Baz
Grouped to the left:
Foo to Bar
Foo to Bar
Bar to Baz
Grouped to the right:
Foo to Baz
Другими словами,
x ?? y ?? z
ведет себя так же, как
x ?? (y ?? z)
но не совпадает с
(x ?? y) ?? z
В настоящее время я не уверен, почему есть два перехода из Foo в Bar при использовании (x ?? y) ?? z
- мне нужно проверить это более тщательно...
EDIT: теперь у меня есть еще один вопрос, чтобы охватить двойное преобразование...