Можно ли создать новый оператор в C #? - PullRequest
59 голосов
/ 24 июня 2009

Я знаю, что вы можете перегрузить существующего оператора. Я хочу знать, возможно ли создать нового оператора. Вот мой сценарий.

Я хочу это:

var x = (y < z) ? y : z;

Чтобы быть эквивалентным этому:

var x = y <? z;

Другими словами, я хотел бы создать свой собственный оператор <?.

Ответы [ 7 ]

38 голосов
/ 24 июня 2009

Нет, это невозможно. Вам нужно будет создать метод вместо

29 голосов
/ 24 июня 2009

Нет, но вы можете перегрузить некоторые существующие операторы в C #.

В некоторых других языках, таких как F #, вы можете использовать:

let (<?) = min
17 голосов
/ 24 июня 2009

Как уже говорилось в других ответах, вы не можете создать новый оператор - по крайней мере, не изменив лексер и парсер, встроенные в компилятор. По сути, компилятор создан для того, чтобы распознавать, что отдельный символ, такой как < или ?, или пара, такая как >> или <=, является оператором и обрабатывать его специально; например, он знает, что i<5 является выражением, а не именем переменной. Признание оператора как оператора - это отдельный процесс от принятия решения о том, что на самом деле делает оператор, и он гораздо более тесно интегрирован в компилятор, поэтому вы можете настроить последний, но не первый.

Для языков, имеющих компилятор с открытым исходным кодом (например, GCC), вы можете теоретически изменить компилятор для распознавания нового оператора. Но это было бы не особенно легко, и кроме того, каждому понадобился бы ваш собственный компилятор для использования вашего кода.

6 голосов
/ 24 июня 2009

Мало того, что вы не можете этого сделать, но почему вы хотите?

Я не уверен, к какому типу относятся y и z, но если они имеют числовой тип значения, вы, вероятно, можете использовать:

var x = Math.Min(y, z);

Хотя лично я все равно предпочел бы:

var x = (y < z) ? y : z;

Но я немного? : junky.

Хороший код не только жесткий и эффективный, но и читаемый. Даже если вы единственный, кто когда-либо читал его, вы однажды вернетесь к этому оператору <? и удивитесь, какого черта это произошло.

5 голосов
/ 24 июня 2009

Нет, но вы можете создать методы расширения вместо этого

y.MethodName(z)
2 голосов
/ 26 июля 2018

Я удивлен, что никто не упомянул "order of operations".

Когда компилятор оценивает выражение, он должен заботиться о выполнении операций в правильном порядке, чтобы умножение (1+2*3) = (2*3+1) всегда происходило перед добавлением при том же "level" в выражении.

При переопределении и операторе вы можете изменить то, что делает оператор, но не порядок, в котором компилятор будет его оценивать. Если вы создали новый оператор, нет способа сообщить компилятору, в каком порядке его оценивать по отношению к другим. Поэтому, если вы напишите x <? 2 + 5 Выполните ли вы сначала x <? 2, затем добавите 5 или сначала выполните добавление, а затем выполните x <? 7.

0 голосов
/ 31 марта 2014

вы можете попытаться перегрузить другой оператор, например % или +, чтобы действовать как <? оператор.

Будет весело

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...