Jak rozumiem, każdy język może mieć własny program obsługi dynamic
, więc stosowane są odpowiednie reguły. Nie jestem pewien, czy poniższe informacje są poprawne/niepoprawne; myśli?Czy należy stosować metodę opartą na interfejsie, która używa "dynamicznego" nadal spełnia zasady rozdzielczości metody C#?
Scenariusz: dwa interfejsy (jeden realizuje drugi) z pewnymi metodami:
public interface IA {
void Bar(object o);
}
public interface IB : IA {
void Foo(object o);
}
i podstawowym realizacja:
public class B : IB {
public void Foo(object o) { Console.WriteLine("Foo"); }
public void Bar(object o) { Console.WriteLine("Bar"); }
}
Teraz, z normalnym C# (bez dynamic
), możemy uzyskać dostęp do metody IA
od celu typu: IB
:
IB b = new B();
var o = new { y = "z" };
b.Foo(o.y); // fine
b.Bar(o.y); // fine
Teraz celowo dodać dynamic
do argumentów, które sprawia, że przetwarzanie całego użycie invoke dynamic
(jak w ogólnym przypadku Rezolucja ta może mieć wpływ na przeciążenie, choć nie będzie tutaj):
IB b = new B();
dynamic x = new {y = "z"};
b.Foo(x.y); // fine
b.Bar(x.y); // BOOM!
która nie z RuntimeBinderException
:
'IB' nie zawierają definicji dla 'bar'
Teraz to co mówi i s całkowicie poprawne, tak jak IB
nie ma ma metodę Bar
. Jednak, jak pokazano w pierwszym przykładzie: w normalnych regułach C# oczekiwano, że ponieważ typ deklaracji celu jest interfejsem (IB
), inne interfejsy znane jako implementowane (tj. IA
) są sprawdzane jako część rozdzielczości przeciążania.
A więc: czy to błąd? Czy mogę to źle odczytać?
+1 Interesujące. Zastanawiam się, czy DLR oferuje mniejsze wsparcie dla tego rodzaju rzeczy w przeciwieństwie do kompilatora/CLR. Zakładam, że DLR odpowiada za próbę rozwiązania połączenia? –
@ Adam, rozumiem, że dla połączeń opartych na odbiciu, istnieje dostawca specyficzny dla języka, dokładnie w celu przestrzegania konwencji językowych, np. 'Microsoft.CSharp.RuntimeBinder.Binder' –
Czy obserwujesz to samo z dziedziczeniem klasy próbującym wywołać podstawowe metody? (W przeciwieństwie do odziedziczonych metod interfejsu). –