2011-10-19 24 views
23

Jeśli mam dynamiczny parametr kompilator wydaje się rów typ zwracanej i myślę, że to dynamiczna.Dynamiczny parametr powoduje kompilator myśleć metoda powrotu jest dynamiczny

Na przykład:

public MethodResult IsValid(object userLogin) 
{  
    return new MethodResult(); 
} 

Można by pomyśleć, że:

var isValidResult = IsValid(someObject()); 

brzmi

dynamic -> MethodResult 

Ale ona uważa, że ​​jest to:

dynamic -> dynamic 

Czy dodanie dynamicznego parametr do podpisu całkowicie powstrzymać kompilator od wiedząc, co zwrot powinien być mimo powrotu jest silnie wpisany?

Odpowiedz

19

Tak dynamiczny zatrzymuje kompilator od znając typ na wszelkich typach parametrów, właściwości lub metody zwrotu. Dodaj wyraźny obsady jak:

(MethodResult)IsValid(someObject)); 

Powodem jest to, że po wpisaniu dynamiczny świat w C# idziesz do późnego wiązania. Kompilator nie może zweryfikować tego kodu, ponieważ nie może już używać żadnej statycznej analizy typu. Odradza się więc do później. Możesz pomóc rozwiązać ten problem, dostarczając statycznych rzutów jako przewodnik dla kompilatora.

+1

Więcej szczegółów sprawdzić [MSDN - Używanie dynamicznych rodzajów] (http://msdn.microsoft.com/en-us/library/dd264736.aspx) - „rozdzielczości przeciążenie występuje w czasie wykonywania zamiast w czasie kompilacji, jeśli jeden lub więcej argumentów w wywołaniu metody mają typ dynamiczny, lub jeśli odbiorca wywołania metody jest typu dynamicznego „. - w wyniku czego do czasu wykonania nie będzie wiadomo, jaka metoda zostanie w ogóle wywołana. –