6

我有一个 DynamicObject 的子类,我想为原始类型实现隐式转换,类似于 DO 的显式转换方法 TryConvert;也就是说,无需编写多个隐式运算符 [type] 函数。

用法:

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

这可能吗?如果可以,怎么做?

4

2 回答 2

6

这里发生了几件事。

首先,您正在执行二元运算。因此,您还需要重写TryBinaryOperation方法。它将在转换之前首先被调用。然后,您可以从 TryBinaryOperation 方法执行转换。

其次,无论出于何种原因,仅当您编写如下语句时才会调用 TryBinaryOperation:

int sum = myDynamicObject + 1;

从我现在看到的情况来看,顺序很重要。我将与 DLR 团队核实这是错误还是预期行为。

更新: 这不是错误。要同时支持“1 + myDynamicObject”和“myDynamicObject + 1”,您不仅需要 TryBinaryOperation,还需要当前 DynamicObject 根本没有的 TryBinaryOperationFromRight 之类的东西。

于 2010-01-18T19:54:09.353 回答
3

DLR 团队回答了我的问题并说当 DO 是右手操作数时这是不可能的。

从他们的回答中引用:“最重要的规则是动态对象需要是左手操作数,因为动态操作协议仅适用于该位置的动态对象。”

左侧隐式转换可以通过 TryBinaryOperation 完成,但为此您还必须实现支持的运算符(+、-、...)。

于 2010-01-20T21:29:41.850 回答