Подтвердить что ты не робот

Возможно перегрузить нуль-коалесцирующий оператор?

Можно ли перегрузить оператор с нулевым слиянием для класса в С#?

Скажем, например, я хочу вернуть значение по умолчанию, если экземпляр равен нулю, и вернуть экземпляр, если это не так. Код будет выглядеть примерно так:

   return instance ?? new MyClass("Default");  

Но что, если я хотел бы использовать оператор объединения нулей, чтобы также проверить, установлен ли MyClass.MyValue?

4b9b3361

Ответ 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");