Le altre risposte che indicano che è stata modificata la firma di un metodo e che pertanto devono ricompilare i chiamanti, sono corrette.Ho pensato di aggiungere alcune informazioni aggiuntive su questo bit della tua domanda:
Mi sembra che a tutti i siti di chiamata a questo metodo non sia stato fatto alcun uso del valore di ritorno (poiché non esisteva prima).
Esattamente. Ora, considera questa domanda: come scrivi il codice che non fa uso dei dati? Sembra che tu stia lavorando sotto la falsa supposizione che non utilizzi un valore non richiede alcun codice, ma non usare un valore richiede sicuramente il codice!
Supponiamo di avere metodi:
static int M1(int y) { return y + 1; }
static void M2(int z) { ... }
e si dispone di una chiamata
int x;
x = M1(123);
Cosa succede a livello IL? il seguente:
- Allocare lo spazio sul pool temporaneo per x.
- Invia 123 in pila
- Invoca M1.
- Premere 1 sulla pila. Stack è ora 1, 123
- Aggiungi le prime due cose in pila. Questo fa scattare entrambi e spinge il risultato. Stack è ora 124.
- ritorno al chiamante
- Lo stack è ancora 124.
- Conservare il valore sullo stack nella memoria temporanea per x. Questo apre lo stack, quindi lo stack è vuoto.
Supponiamo ora fa:
M1(345);
cosa succede? Stessa cosa:
- Spingere 345 sullo stack
- Invoke M1.
- Premere 1 sulla pila. Stack è ora 1, 345
- Aggiungi le prime due cose in pila. Questo fa scattare entrambi e spinge il risultato. Pila è ora 346.
- ritorno al chiamante
- Lo stack è ancora 346.
ma non c'è nessuna istruzione che memorizza il valore sullo stack da nessuna parte, quindi dobbiamo emettere un'istruzione pop:
- Inserisci il valore inutilizzato fuori dallo stack.
Ora supponiamo che si chiama
M2(456);
Che cosa succede?
- Spingere 456 sullo stack
- Invoke M2.
- M2 fa il suo dovere. Quando ritorna al chiamante, lo stack è vuoto perché è vuoto restituire.
- Ora lo stack è vuoto, quindi non farne uscire nulla.
Ora capisci perché la modifica di un metodo da ritorno a valore vuoto a valore restituito è un cambiamento di rottura? Ora ogni chiamante deve estrarre il valore inutilizzato dallo stack. Fare niente con dati richiede comunque di pulirlo dal pacco. Si sta disallineare lo stack se non si esclude tale valore; il CLR richiede che lo stack sia vuoto all'inizio di ogni istruzione per garantire che questo tipo di disallineamento non avvenga.
fonte
2012-02-07 15:55:42
Modificato il mio esempio. Il mio punto era che il metodo restituisce qualcosa ora; ma tutto il codice che in precedenza lo utilizzava non faceva nulla con esso. È perfettamente legale scrivere questo codice. –