Ändert das Hinzufügen optionaler Parameter Methodensignaturen und löst sie die Methode missing exception aus?

7

Wir haben mehrere Projekte, die auf die Bibliothek assembly verweisen, rufen Sie "myUtil" auf, jetzt ist eine der Methoden, auf die in mehreren Projekten verwiesen wird,

%Vor%

Wenn ich jetzt die obige Methode ändere,

%Vor%

Muss ich die Assembly "myUtil.dll" in Projekte aktualisieren, die darauf verweisen?

Ohne darauf Bezug zu nehmen, erhalte ich diesen Fehler, der Sinn macht und verschwindet, wenn ich die Referenz aktualisiere, aber ich bin nicht in der Lage, Referenz zu finden, wo es heißt, Referenzen aktualisieren zu müssen

  

System.MissingMethodException: Methode nicht gefunden: 'Void GetData (....

    
Mathematics 19.05.2015, 05:43
quelle

3 Antworten

9

Alle Referenzen müssen aktualisiert werden.

Optionale Parameter sind nur syntaktischer Zucker.

Wenn Sie dies haben:

%Vor%

Und nenne es so:

%Vor%

Der Compiler macht das:

%Vor%

Sie müssen alle Assemblys / Projekte neu kompilieren und replizieren, die darauf verweisen.

    
Brendan Green 19.05.2015, 05:48
quelle
8

Sie müssen die Referenz nicht entfernen und neu hinzufügen, aber Sie müssen alle Projekte neu kompilieren, die mit der DLL kompiliert werden. Das Hinzufügen eines optionalen Parameters ist eine quellkompatible, aber keine binärkompatible Änderung, da der Compiler an der -Aufrufstelle verschiedene ILs aussendet, um den Standardwert als normal einzuschließen - der Aufruf selbst sieht gleich aus die IL, ob der optionale Parameter weggelassen wurde oder nicht.

Betrachten Sie zum Beispiel den folgenden Code:

%Vor%

Die IL für Main sieht folgendermaßen aus:

%Vor%

Wie Sie sehen können, wird die Konstante 5 in der Main Methode geladen und als Argument übergeben, genau wie 3 explizit. Das gleiche passiert über Baugruppengrenzen.

Dieselben Regeln gelten auch für das Ändern der Werte von Konstanten und das Ändern des Standardwerts eines optionalen Parameters - all dies erfordert Client-Neuerstellungen.

    
Jon Skeet 19.05.2015 05:50
quelle
3

Sie können die Kompatibilität beibehalten, wenn Sie die optionalen Parameter nicht mehr verwenden und stattdessen eine Methodenüberladung verwenden:

%Vor%

Wird

%Vor%

Dies spiegelt jedoch keine Änderung des Standardwert wider, es sei denn, Sie kompilieren alle Projekte neu. Zum Beispiel wird jedes alte GetData(1, "2", null) immer das neue GetData(1, "2", null, false) aufrufen, auch wenn Sie

ändern %Vor%

bis

%Vor%     
Johnbot 19.05.2015 08:29
quelle

Tags und Links