DynamicObject неявный кастинг

У меня есть подкласс DynamicObject, и я хотел бы реализовать неявный кастинг для типов примитивов так же как явный метод броска DO TryConvert; то есть, не пишущий несколько неявных операторов [тип] функции.

Использование:

dynamic myDynamicObject = new MyDynamicObject("1");
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject;

Это возможно и если так, как?

5
задан denfromufa 24 August 2016 в 04:47
поделиться

2 ответа

Здесь происходит несколько вещей.

Во-первых, вы выполняете двоичную операцию. Итак, необходимо также переопределить метод TryBinaryOperation. Он будет вызван первым, перед преобразованием. Затем с помощью метода TryBinaryOperation можно выполнить преобразование.

Во-вторых, по какой бы то ни было причине метод TryBinaryOperation вызывается только в том случае, если Вы напишете следующее утверждение:

int sum = myDynamicObject + 1;

Из того, что я вижу сейчас, порядок важен. Я проверю с командой DLR, является ли это ошибкой или предполагаемым поведением.

Update: Это не жучок. Для поддержки как "1 + myDynamicObject", так и "myDynamicObject + 1" вам понадобится не только TryBinaryOperation, но и что-то вроде TryBinaryOperationFromRight, чего у текущего DynamicObject просто нет.

6
ответ дан 14 December 2019 в 01:08
поделиться

DLR-команда ответила на мой вопрос и сказал, что это невозможно, когда делается правая операнда.

цитируется из своего ответа: «Предварительное правило заключается в том, что динамический объект должен быть левой ручной операндом, поскольку протокол динамических операций работает только с динамическим объектом в этом положении».

Неявное литье левого руки можно сделать с помощью TrybinaryOperation, но для этого вы Также реализовать поддерживаемые операторы (+, -, ...).

3
ответ дан 14 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: