Frage

Der Aufruf eines internen Konstruktors mit einem dynamischen Argument in C# 4.0b führt zur folgenden Ausnahme

System.ArgumentNullException:Wert darf nicht NULL sein.Parametername:Konstrukteur

Beispielcode (danke an Jon Skeet)

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

Es scheint, dass die Laufzeit interne Konstruktoren nicht berücksichtigt, wenn sie versucht, den richtigen auszuwählen.Das scheint ein Fehler zu sein, also habe ich ihn auf Connect gepostet:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472924

Es scheint, dass sie es für die neue Version behoben haben.

War es hilfreich?

Lösung

EDIT: Okay, habe ich verfolgt es jetzt viel weiter nach unten - es einen internen Konstruktor verwenden, die ein Problem verursacht

.

Hier ist ein wirklich kurz, aber vollständiges Beispiel, das das Problem veranschaulicht:

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

Ich schlage vor, Sie diese log mit Verbinden - dann schreiben Sie die URL hier und wir können darüber abstimmen :)

(Meine Vermutung ist, dass innerhalb des DLR gibt es einen Aufruf an GetConstructor ohne die entsprechende BindingFlags.NonPublic, aber das ist nur eine Vermutung ...)

Andere Tipps

Ohne den Code zu sehen, würde ich vorschlagen, dass Sie eine nicht instanziierte Klasse an Ihren Konstruktor übergeben.Stellen Sie sicher, dass sie innerhalb des Gültigkeitsbereichs liegen und instanziiert wurden, z. B.mithilfe von new, bevor sie an Ihr nicht dynamisches Objekt übergeben werden.

Bearbeiten

Wenn ich Ihren Code sehe, würde ich vorschlagen, dass Sie DynamicObject anstelle von Dynamic für Ihren Hilfskostruktor und Ihre Entity-Eigenschaft verwenden.

Bearbeiten Sie, nachdem Sie Jons Antwort gesehen haben

Ich denke, dass das Problem darin besteht, die GetEntity()-Methode zum Generieren der dynamischen Objektinstanz zu verwenden.

Ich stelle fest, dass Jon eine Instanz von MyDynamicObject im selben Bereich erstellt, in dem er sie verwendet.

Ich gehe davon aus, dass Sie eine Instanz Ihres Objekts innerhalb der GetEntity()-Methode generieren. In diesem Fall befindet es sich nicht mehr im Gültigkeitsbereich, wenn Sie es verwenden, sondern wird als lokales Objekt klassifiziert.

Durch die Verwendung von "MyDynamicObject e = entity;" wird der Compiler gezwungen, implizit den MyDynamicObject-Konstruktor zu verwenden und ihm das Ergebnis zuzuordnen.Daher ist der Adressraum bereits zugewiesen und kann bei der Übergabe an den Hilfskonstruktor verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top