2010-01-16 13 views
5

저는 DynamicObject의 하위 클래스가 있습니다. 따라서 DO의 명시 적 캐스팅 메소드 TryConvert와 마찬가지로 프리미티브 유형의 암시 적 캐스팅을 구현하고 싶습니다. 즉, 여러 암시 적 연산자 [유형] 함수를 작성하지 않아도됩니다.DynamicObject 암시 적 캐스팅

사용법 :

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

는 가능하고 만약 그렇다면, 어떻게?

답변

5

여기에 몇 가지가 있습니다.

먼저 이진 연산을 수행하고 있습니다. 따라서 TryBinaryOperation 메서드도 재정의해야합니다. 회심하기 전에 먼저 부름을받을 것입니다. 그런 다음 TryBinaryOperation 메서드에서 변환을 수행 할 수 있습니다. 이 같은 명령문을 작성하는 경우에만 TryBinaryOperation를 호출 할 어떤 이유

둘째 :

내가 지금 무엇을보고에서
int sum = myDynamicObject + 1; 

, 순서가 중요합니다. DLR 팀에 버그인지 의도 된 동작인지 확인하겠습니다.

업데이트 : 이것은 버그가 아닙니다. "1 + myDynamicObject"와 "myDynamicObject + 1"을 모두 지원하려면 TryBinaryOperation뿐만 아니라 TryBinaryOperationFromRight와 같은 것이 필요합니다. 현재 DynamicObject에는 가지고 있지 않습니다.

+0

"1 + myDynamicObject"시나리오에서 암시 적 캐스트를 사용하면 캐스트 유형에서 왼쪽면 연산이 사용됩니다. 이 경우 ints operation + (int, int). 하지만 그렇습니다. TryBinaryOperation은 왼쪽 작업 만 지원합니다. 그래서 명시 적 캐스팅에 대한 TryConvert와 같은 암시 적 캐스팅과 비슷한 방법이 매우 유용합니다. –

+0

사실 TryConvert는 암시 적 및 명시 적 캐스팅을 모두 지원합니다. 예를 들어,이 잘 작동합니다. "int sum = myDynamicObject;" TryConvert를 재정의하는 경우. 그러나 이진 연산을 수행 할 때 (그리고 단항도 같음) TryConvert 메서드가 호출되지 않습니다. [email protected]에 글을 작성하고 사용 사례를 설명해주십시오. 그것은 버그 일 수도 있고, 팀이 나보다 잘 설명 할 수있는 배후의 합리적 디자인 일 수도 있습니다. –

3

DLR-team이 내 질문에 대답하고 DO가 오른쪽 피연산자 일 때 불가능하다고 말했습니다.

대답에서 인용 함 : "동적 작업 프로토콜은 해당 위치의 동적 개체에서만 작동하므로 가장 중요한 규칙은 동적 개체가 왼쪽 피연산자이어야한다는 것입니다."

왼쪽 암시 적 캐스팅은 TryBinaryOperation을 통해 수행 할 수 있지만이를 위해 지원되는 연산자 (+, -, ...)도 구현해야합니다.