Возможно перегрузить нуль-коалесцирующий оператор?
Можно ли перегрузить оператор с нулевым слиянием для класса в С#?
Скажем, например, я хочу вернуть значение по умолчанию, если экземпляр равен нулю, и вернуть экземпляр, если это не так. Код будет выглядеть примерно так:
return instance ?? new MyClass("Default");
Но что, если я хотел бы использовать оператор объединения нулей, чтобы также проверить, установлен ли MyClass.MyValue?
Ответы
Ответ 1
Хороший вопрос! Он не указан так или иначе в списке перегружаемых и неперегружаемых операторов и ничего не упоминается в страница оператора.
Итак, я попробовал следующее:
public class TestClass
{
public static TestClass operator ??(TestClass test1, TestClass test2)
{
return test1;
}
}
и я получаю сообщение об ошибке "Ожидается перегружаемый двоичный оператор". Поэтому я бы ответил, что с .NET 3.5 нет.
Ответ 2
Согласно стандарту ECMA-334 перегрузка не возможна. оператор.
Точно так же вы не можете перегружать следующие операторы:
- знак равно
- &&
- ||
- ?:
- ?.
- проверено
- непроверенный
- новый
- тип
- как
- является
Ответ 3
Простой ответ: Нет
Принципы проектирования С# не позволяют перегрузке оператора изменять семантику языка. Поэтому сложные операторы, такие как составное назначение, тройной оператор и... не могут быть перегружены.
Ответ 4
Это, по слухам, является частью следующей версии С#. Из http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
7. Monadic null check
Удаляет необходимость проверки нулей перед доступом к свойствам или методам. Известен как безопасный навигационный оператор в Groovy).
Перед
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
После
var bestValue = points?.FirstOrDefault()?.X ?? -1;
Ответ 5
Если кто-то ищет решение, самым близким примером будет это сделать
return instance.MyValue != null ? instance : new MyClass("Default");