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