Возможно переопределить нуль-коалесцирующий оператор? - PullRequest
40 голосов
/ 08 декабря 2008

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

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

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

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

Конечно, в этом нет особой необходимости (по крайней мере, я так думаю) - поэтому прежде чем вы ответите «зачем вам это делать» - Мне просто любопытно, возможно ли это .

Ответы [ 5 ]

29 голосов
/ 08 декабря 2008

Хороший вопрос! Он так или иначе не указан в списке перегружаемых и не перегружаемых операторов и ничего не упоминается на странице оператора .

Итак, я попробовал следующее:

public class TestClass
{
    public static TestClass operator ??(TestClass  test1, TestClass test2)
    {
        return test1;
    }
}

и я получаю сообщение об ошибке «Ожидается перегрузка двоичного оператора». Поэтому я бы сказал, что ответ, начиная с .NET 3.5, - нет.

14 голосов
/ 08 декабря 2008

В соответствии со стандартом ECMA-334 перегрузка невозможна. оператор.

Аналогично, вы не можете перегрузить следующие операторы:

  • =
  • &&
  • ||
  • :
  • проверено
  • снят
  • новый
  • TypeOf
  • в
  • есть
7 голосов
/ 08 декабря 2008

Простой ответ: Нет

Принципы проектирования C # не допускают перегрузки операторов, которые изменяют семантику языка. Поэтому сложные операторы, такие как составное присваивание, троичный оператор и ..., не могут быть перегружены.

3 голосов
/ 10 января 2014

По слухам, это часть следующей версии C #. От http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7. Монадическая проверка на ноль

Устраняет необходимость проверки на нулевые значения перед доступом к свойствам или методам Известный как оператор безопасной навигации в Groovy).

До

if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}   
return -1;

* После 1020 *

var bestValue = points?.FirstOrDefault()?.X ?? -1;
0 голосов
/ 19 ноября 2009

Если кто-то ищет решение, ближайший пример - это

return instance.MyValue != null ? instance : new MyClass("Default");
...