Если:
- вам просто нужно простое в программировании решение
- ваш маленький язык имеет те же арифметические правила, что и C #
- вы можете использовать C # 4
- вас не особо заботит производительность
тогда вы можете просто сделать это:
public static object Add(dynamic left, dynamic right)
{
return left + right;
}
Готово. Что произойдет, когда этот метод будет вызван, код снова запустит компилятор C # и спросит компилятор "что бы вы сделали, если бы вам пришлось добавить эти две вещи, но вы знали их типы времени выполнения при компиляции" время?" (Динамическая языковая среда выполнения затем кеширует результат, так что в следующий раз, когда кто-то попытается добавить два целых числа, компилятор не запустится снова, он просто повторно использует лямбду, которую компилятор передал обратно в DLR.)
Если вы хотите реализовать свои собственные правила для добавления, добро пожаловать в мой мир. Нет волшебной дороги, которая бы избегала множества проверок типов и переключателей. Существует буквально сотен возможных случаев добавления двух произвольных типов, и вы должны проверить их все.
Способ, которым мы справляемся с этой сложностью в C #, состоит в том, что мы определяем операторы сложения для меньшего подмножества типов: int, uint, long, ulong, decimal, double, float, все перечисления, все делегаты, строки и все версии, допускающие значения NULL. из этих типов значений. (Перечисления затем обрабатываются как их базовые типы, что еще больше упрощает.)
Так, например, когда вы добавляете ushort к короткому, мы упрощаем проблему, говоря, что ushort и short являются частными случаями типа int, а затем решаем проблему добавления двух целых чисел. Это значительно сокращает объем кода, который мы должны написать. Но поверьте мне, алгоритм разрешения перегрузки бинарного оператора в C # - это тысячи строк кода. Это не простая проблема.
Если ваш игрушечный язык предназначен для использования в качестве динамического языка со своими собственными правилами, вы можете рассмотреть возможность реализации IDynamicMetaObjectProvider и использования механизмов DLR для реализации арифметических и других операций, таких как вызов функции.