#c_sharp #рефлексия
Товарищи, возник следующий вопрос: балуясь с рефлексией, можно из классов доставать
методы, определяющие работу их операторов сложения, вычитания и прочих, зная специальные
имена (вроде op_Addition).
К примеру сей код:
DateTime test = (DateTime)typeof(DateTime).GetMethod("op_Addition").Invoke(null,
new object[] { DateTime.Now, new TimeSpan(10) });
Работает аки часы. Однако подобный «трюк» не проходит с Int32, String и некоторыми
другими классами. Такое чувство, будто для них и не определены таковые операторы, хотя
мы знаем, что это не так
Собственно, делая выжимку, мой вопрос таков: где упрятаны методы, определяющие операторы
сложения и подобных для Int32, к примеру?
Ответы
Ответ 1
Они нигде не спрятаны, таких методов попросту нет. Когда компилятор обрабатывает оператор сложения для Int32, он просто генерирует add инструкцию в IL коде. Это сделано в целях производительности. Аналогично со всеми базовыми типами, которые умеет обрабатывать процессор напрямую: Int64, float, double. Исключение из этого правила - тип string. Когда компилятор встречает оператор + для строк, он генерирует вызов статического метода Concat(string, string).
Комментариев нет:
Отправить комментарий