У меня есть подкласс DynamicObject, и я хотел бы реализовать неявный кастинг для типов примитивов так же как явный метод броска DO TryConvert; то есть, не пишущий несколько неявных операторов [тип] функции.
Использование:
dynamic myDynamicObject = new MyDynamicObject("1");
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject;
Это возможно и если так, как?
Здесь происходит несколько вещей.
Во-первых, вы выполняете двоичную операцию. Итак, необходимо также переопределить метод TryBinaryOperation. Он будет вызван первым, перед преобразованием. Затем с помощью метода TryBinaryOperation можно выполнить преобразование.
Во-вторых, по какой бы то ни было причине метод TryBinaryOperation вызывается только в том случае, если Вы напишете следующее утверждение:
int sum = myDynamicObject + 1;
Из того, что я вижу сейчас, порядок важен. Я проверю с командой DLR, является ли это ошибкой или предполагаемым поведением.
Update: Это не жучок. Для поддержки как "1 + myDynamicObject", так и "myDynamicObject + 1" вам понадобится не только TryBinaryOperation, но и что-то вроде TryBinaryOperationFromRight, чего у текущего DynamicObject просто нет.
DLR-команда ответила на мой вопрос и сказал, что это невозможно, когда делается правая операнда.
цитируется из своего ответа: «Предварительное правило заключается в том, что динамический объект должен быть левой ручной операндом, поскольку протокол динамических операций работает только с динамическим объектом в этом положении».
Неявное литье левого руки можно сделать с помощью TrybinaryOperation, но для этого вы Также реализовать поддерживаемые операторы (+, -, ...).