Подтвердить что ты не робот

Возможно ли создать новый оператор в С#?

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

Я хочу это:

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

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

var x = y <? z;

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

4b9b3361

Ответ 1

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

y.MethodName(z)

Ответ 6

Я удивлен, что никто не упомянул "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.

Ответ 7

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

Будет весело