#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).
Комментариев нет:
Отправить комментарий