Определить новые операторы в C#? [дубликат]

13
задан Community 23 May 2017 в 12:08
поделиться

4 ответа

Нет, это невозможно, если не создать собственный компилятор, похожий на C #.

Можно переопределить только некоторые встроенные операторы, нельзя создавать новые, а лямбда-оператор (= >) нельзя переопределить.

-121--2717415-

Вы смешиваете входные потоки с управляющими сигналами. Консольный процесс имеет входной поток по умолчанию, которым можно управлять с помощью StandardInput, как вы уже знаете. Но Ctrl-C и Ctrl-Break не являются символами, посылаемыми процессу через этот поток, а являются управляющими сигналами , которые процесс получает с помощью зарегистрированных обработчиков сигналов, см. CTRL + C и CTRL + BREAK Signals :

По умолчанию, когда окно консоли имеет фокус клавиатуры, CTRL + C или CTRL + BREAK рассматривается как сигнал (SIGINT или SIGBREAK), а не как ввод с клавиатуры.

Для передачи поддельных сигналов в процесс можно использовать GenerateConsureStartEvent и отправить CTRL _ C _ EVENT или CTRL _ BREAK _ EVENT . Этот API не имеет эквивалента .Net, поэтому необходимо его PInvoke.

Для использования с .NET необходимо просто включить определение функции:

const int CTRL_C_EVENT = 0;
const int CTRL_BREAK_EVENT = 1;

[DllImport("kernel32.dll")]
static extern bool GenerateConsoleCtrlEvent(
    uint dwCtrlEvent,
    uint dwProcessGroupId);
-121--3767161-

Это не встроено в язык. Вы столкнулись с перегрузкой предопределенных операторов, поставляемых с языком ( перегружаемые операторы ).

Если вам нравится этот стиль отладки, вы можете рассмотреть F # . Это функциональный язык, который работает поверх платформы .NET и дает возможность определить любой нужный оператор.

10
ответ дан 2 December 2019 в 00:46
поделиться

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

0
ответ дан 2 December 2019 в 00:46
поделиться

Список операторов, которые могут быть перегружены, находится здесь.

Перегрузка операторов позволяет только изменять поведение операторов, но не определять новые.

И хотя A => B в виде A.Implies(B) может звучать круто, это создаст вам проблемы позже (через 6 месяцев, когда вы будете пытаться понять, что должен делать ваш код).

3
ответ дан 2 December 2019 в 00:46
поделиться

Нет, это невозможно, если вы не создадите свой собственный компилятор, подобный C #.

Вы можете переопределить только некоторые встроенные операторы, вы не можете создавать новые, а лямбда-оператор (=>) не может быть переопределен.

0
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: