Heim >Backend-Entwicklung >C++ >Warum lösen dynamische Erweiterungsmethoden RuntimeBinderExceptions in C# aus?
RuntimeBinderException
In C# müssen wir häufig neue Methoden zu vorhandenen Klassen hinzufügen, ohne den ursprünglichen Quellcode zu ändern. Um diesem Bedarf gerecht zu werden, wurden Erweiterungsmethoden eingeführt.
Betrachten Sie eine Liste von Ganzzahlen und greifen Sie mit der Methode First()
auf das erste Element zu:
<code class="language-csharp">List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 }; Console.WriteLine(list.First());</code>
Dieser Code funktioniert perfekt. Wenn Sie jedoch versuchen, dieselbe Liste mit dem Schlüsselwort dynamic
in ein dynamisches Objekt umzuwandeln, wird eine Ausnahme ausgelöst:
<code class="language-csharp">dynamic dList = list; Console.WriteLine(dList.First()); // 抛出 RuntimeBinderException</code>
Um dieses ungewöhnliche Verhalten zu verstehen, müssen wir den zugrunde liegenden Mechanismus von Erweiterungsmethoden genau verstehen. In nicht dynamischem Code durchsucht der Compiler alle bekannten Klassen nach einer statischen Klasse, die eine passende Erweiterungsmethode bereitstellt. Diese Suche folgt der Namensraum-Verschachtelungsreihenfolge und den verfügbaren using
-Direktiven.
Die Dynamic Language Runtime (DLR) stößt beim Aufruf dynamischer Erweiterungsmethoden auf eine Herausforderung. Es muss zur Laufzeit die im Quellcode vorhandenen Namespace-Verschachtelungen und using
-Direktiven ermitteln. Es gibt jedoch keinen praktischen Mechanismus, um diese Informationen in der aufrufenden Site zu kodieren. Zwar wurde über die Möglichkeit nachgedacht, einen solchen Mechanismus zu entwerfen, die Umsetzung wurde jedoch letztendlich als zu kostspielig und riskant erachtet.
Das obige ist der detaillierte Inhalt vonWarum lösen dynamische Erweiterungsmethoden RuntimeBinderExceptions in C# aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!