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


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

Я хочу этого:

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

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

var x = y <? z;

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

7 54

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-->