Ответ 1
Нет, это невозможно. Вам нужно будет создать метод вместо
Я знаю, что вы можете перегрузить существующего оператора. Я хочу знать, можно ли создать новый оператор. Вот мой сценарий.
Я хочу это:
var x = (y < z) ? y : z;
Чтобы быть эквивалентным этому:
var x = y <? z;
Другими словами, я хотел бы создать свой собственный оператор <?
.
Нет, это невозможно. Вам нужно будет создать метод вместо
Нет, но вы можете перегрузить некоторые существующие операторы в С#.
На некоторых других языках, таких как F #, вы можете использовать:
let (<?) = min
Как уже говорилось в других ответах, вы не можете создать новый оператор - по крайней мере, не изменяя лексер и парсер, встроенные в компилятор. В принципе, компилятор построен для распознавания того, что отдельный символ, например <
или ?
, или пара, подобная >>
или <=
, является оператором и специально ее обрабатывает; он знает, что i<5
- выражение, а не имя переменной, например. Признание оператора как оператора - отдельный процесс, позволяющий решить, что на самом деле делает оператор, и гораздо более тесно интегрирован в компилятор - вот почему вы можете настроить последнее, но не первое.
Для языков, имеющих компилятор с открытым исходным кодом (например, GCC), теоретически вы можете модифицировать компилятор для распознавания нового оператора. Но это было бы не так просто, и, кроме того, каждому понадобится ваш собственный компилятор для использования вашего кода.
Вы не только не можете этого сделать, но и почему хотите?
Я не уверен, что тип y и z, но если они имеют числовой тип значения, вы, вероятно, можете использовать:
var x = Math.Min(y, z);
Хотя лично я бы предпочел:
var x = (y < z) ? y : z;
Но я немного?: junky.
Хороший код не просто плотный и эффективный, но и читаемый. Даже если вы единственный, кто когда-либо читал это, вы вернетесь к этому оператору <?
в один прекрасный день и задаетесь вопросом, что это за черт.
Нет, но вместо этого вы можете создавать методы расширения вместо
y.MethodName(z)
Я удивлен, что никто не упомянул "order of operations"
.
Когда компилятор оценивает выражение, он должен иметь дело с выполнением операций в правильном порядке, так что (1+2*3) = (2*3+1)
умножение всегда происходит до добавления на том же "level"
в выражении,
Когда вы переопределяете и выполняете оператор, вы можете изменить то, что делает оператор, но не порядок, в котором компилятор будет его оценивать. Если вы создали новый оператор, невозможно сообщить компилятору, какой порядок его оценивать по отношению к другим. Итак, если вы пишете x <? 2 + 5
x <? 2 + 5
Выполняете ли вы x <? 2
x <? 2
сначала добавьте 5 или сначала выполните добавление, а затем выполните x <? 7
x <? 7
.
вы можете попытаться перегрузить другой оператор, например %
или +
, чтобы действовать как оператор <?
.
Будет весело