Можно ли создать новый оператор в C#?

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

Я хочу этого:

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

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

var x = y <? z;

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

7 ответов


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


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

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

let (<?) = min

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

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


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

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

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

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

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

но я немного ? : наркоман.

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


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

y.MethodName(z)

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

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

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


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

будет весело!--4-->