Laden...

[erledigt]Wie kann ich ein dynamic zu einem object casten?

Erstellt von Yeats vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.199 Views
Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 5 Jahren
[erledigt]Wie kann ich ein dynamic zu einem object casten?

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

2.079 Beiträge seit 2012
vor 5 Jahren

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.

Y
Yeats Themenstarter:in
102 Beiträge seit 2005
vor 5 Jahren

Ah, ja so betrachtet macht es natürlich Sinn.