2010-01-16 9 views
5

Ho una sottoclasse di DynamicObject e vorrei implementare il cast implicito per i tipi primitivi in ​​modo simile al metodo di casting esplicito di DO TryConvert; cioè, senza scrivere più funzioni implicite [tipo].DynamicObject implicit casting

Usage:

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

È questo possibile e se sì, come?

risposta

5

Qui ci sono diverse cose.

Innanzitutto, si sta eseguendo un'operazione binaria. Quindi, è necessario sostituire anche il metodo TryBinaryOperation. Sarà chiamato prima, prima della conversione. Quindi dal metodo TryBinaryOperation è possibile eseguire una conversione.

In secondo luogo, per qualsiasi motivo il TryBinaryOperation viene chiamato solo se si scrive una dichiarazione come questa:

int sum = myDynamicObject + 1; 

Da quello che vedo oggi, l'ordine è importante. Controllerò con il team DLR se si tratta di un bug o di un comportamento previsto.

Aggiornamento: Non è un bug. Per supportare sia "1 + myDynamicObject" e "myDynamicObject + 1" è necessario non solo TryBinaryOperation, ma anche qualcosa come TryBinaryOperationFromRight, che l'attuale DynamicObject semplicemente non ha.

+0

Con il cast implicito nello scenario "1 + myDynamicObject" utilizza l'operazione sul lato sinistro del tipo di getto; in questo caso ints operation + (int, int). Ma sì, TryBinaryOperation supporta solo le operazioni sul lato sinistro. Ecco perché un simile metodo di casting implicito come TryConvert per il casting esplicito sarebbe molto utile. –

+0

TryConvert supporta infatti il ​​casting implicito ed esplicito. Ad esempio, funziona bene: "int sum = myDynamicObject;" se si sostituisce TryConvert. Ma quando si esegue un'operazione binaria (e credo che anche un unario), il metodo TryConvert non viene chiamato. Ti suggerisco di scrivere a [email protected] e spiegare il tuo caso d'uso lì. Potrebbe essere un bug o potrebbe esserci qualche design razionale dietro a questo, che il team può spiegare meglio di me. –

3

Il team DLR ha risposto alla mia domanda e ha affermato che non è possibile quando DO è l'operando di destra.

Citato dalla risposta: "La regola principale è che l'oggetto dinamico deve essere l'operando di sinistra perché il protocollo di operazioni dinamiche funziona solo con l'oggetto dinamico in quella posizione."

Il casting implicito a sinistra può essere eseguito tramite TryBinaryOperation, ma per questo è necessario implementare anche gli operatori supportati (+, -, ...).