Другие ответы, в которых говорится, что вы изменили сигнатуру метода и, следовательно, должны перекомпилировать вызывающие, верны. Я подумал, что мог бы добавить дополнительную информацию по этому вопросу:
Мне кажется, что на всех сайтах вызова этого метода не использовалось возвращаемое значение (так как оно раньше не существовало).
Это совершенно верно. Теперь рассмотрим вопрос: как писать код, который не использует данные ? Похоже, вы работаете под совершенно ложным предположением, что не использует значение , не требует кода, но не использует значение, безусловно, требует кода!
Предположим, у вас есть методы:
static int M1(int y) { return y + 1; }
static void M2(int z) { ... }
и у вас есть звонок
int x;
x = M1(123);
Что происходит на уровне IL ? следующее:
- Выделите место во временном пуле для x.
- Нажмите 123 в стеке
- Вызов M1.
- Нажмите 1 в стеке. Стек теперь 1, 123
- Добавьте две верхние вещи в стек. Это выскакивает и подталкивает результат. Стек теперь 124.
- Возврат к звонящему
- стек по-прежнему 124.
- Сохранить значение в стеке во временном хранилище для x. Это вытолкнет стек, поэтому стек теперь пуст.
Предположим, теперь вы делаете:
M1(345);
Что происходит? То же самое :
- Нажмите 345 в стеке
- Вызов M1.
- Нажмите 1 в стеке. Стек теперь 1, 345
- Добавьте две верхние вещи в стек. Это выскакивает и подталкивает результат. Стек теперь 346.
- Вернуться к звонящему
- Стек все еще 346.
Но нет инструкции, которая хранит значение в стеке, поэтому мы должны выполнить команду pop:
- Выкинуть неиспользуемое значение из стека.
Теперь предположим, что вы звоните
M2(456);
Что происходит?
- Нажмите 456 в стеке
- Вызов M2.
- М2 делает свое дело. Когда он возвращается к вызывающей стороне, стек пуст, потому что он возвращается пусто.
- Стек теперь пуст, поэтому ничего с него не вытряхивайте.
Теперь вы понимаете, почему изменение метода с возврата void на возврат значения является критическим изменением? Каждый вызывающий теперь должен выкинуть неиспользуемое значение из стека . Для выполнения ничего с данными все еще требуется очистить их от стека . Вы неправильно выравниваете стек, если не выталкиваете это значение; CLR требует, чтобы стек был пуст в начале каждого оператора, чтобы избежать такого смещения.