Hallo,
Ich hab ein Verständisproblem mit dynamic.
Folgende Method:
public object Cast(dynamic dynObj){
return (object)dynObj;
}
Diese Methode wird mit einem dynamic object aufgerufen.
public class Test : DynamicObject{xxx}
Test test = new Test();
dynamic obj = (dynamic)test;
var x = Test(obj);
Soweit ist auch alles in Ordnung. Was mich allerdings wundert, wenn der Kompiler den Typen selbst erkennt, dann ist für ihn x vom Typ dynamic.
Wenn ich den Aufruf so gestalte, dann ist x vom Typ object.
object x = Test(obj);
Meine Frage ist jetzt eigentlich nur, warum wird bei impliziter Konvertierung der Typ auf dynamic gecastet?
Grüße
Ich versuche deine Frage mal etwas anders zu formulieren:
Folgende Methode:
public int Cast(dynamic dynObj)
{
return 123;
}
(Ich habe bewusst int als Rückgabewert verwendet, damit es mehr auffällt)
Zwei Aufrufe:
Test test = new Test();
dynamic obj = (dynamic)test; // man achte darauf, dass die Variable explizit dynamic ist
var result = Cast(obj); // result wird als Typ dynamic erkannt
// ================================
Test test = new Test();
object obj = (dynamic)test; // man achte darauf, dass die Variable explizit object ist
var result = Cast(obj); // result wird als Typ int erkannt
Ich hab dazu diese Frage gefunden.
The reason here is that once you enter the dynamic world in C# you are going into late binding. The compiler can't verify this code because it can no longer use any static type analysis. So it defers until later. You can help overcome this by providing static casts as a guide for the compiler.
Ich tippe darauf, dass sich die Entwickler etwas Arbeit gespart haben, auch wenn es, logisch betrachtet, möglich gewesen wäre.
Vermutlich ist es so schon komplex genug, voraus ahnen zu können, welchen Typ eine Variable haben wird und zwischendurch dynamic macht das sicher nicht einfacher. Der einfachere Weg war daher, bei jeder Verwendung von dynamic die dadurch entstehenden Variablen pauschal ebenfalls als dynamic zu interpretieren.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.