Действительно ли возможно перегрузить объединяющий пустой указатель оператор для класса в C#?
Скажите, например, что я хочу возвратить значение по умолчанию, если экземпляр является пустым, и возвратите экземпляр, если это не. Код был бы похож на что-то вроде этого:
return instance ?? new MyClass("Default");
Но что, если я хотел бы использовать объединяющий пустой указатель оператор, чтобы также проверить если MyClass. MyValue установлен?
Хороший вопрос! Это не перечислено так или иначе в список сверхзагружаемых и несверхзагружаемых операторов , и ничто не упоминается на страница .
оператора, Таким образом, я попробовал следующее:
public class TestClass
{
public static TestClass operator ??(TestClass test1, TestClass test2)
{
return test1;
}
}
и я получаю ошибку "Сверхзагружаемый ожидаемый бинарный оператор". Таким образом, я сказал бы, что ответ, с.NET 3.5, нет.
Согласно стандарт ECMA-334, не возможно перегрузиться?? оператор.
Точно так же Вы не можете перегрузить следующие операторы:
Простой ответ: Никакой
принципы разработки C# не позволяют оператор, перегружающий ту семантику изменения языка. Поэтому сложные операторы, такие как составное присвоение, тернарный оператор и... не могут быть перегружены.
Если кто-то здесь ищет решение, ближайшим примером может быть это
return instance.MyValue != null ? instance : new MyClass("Default");