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 に答える