Esta é uma pergunta de acompanhamento para essa outra pergunta.
fundo
Trabalhando no Tutorial de Delegados do MSDN (C #) , vejo o seguinte:
Observe que depois que um delegado é criado, o método ao qual ele está associado nunca muda - os objetos delegados são imutáveis.
E então, no exemplo de código, vejo isso (espalhe um pouco pelo código):
public delegate void ProcessBookDelegate(Book book);
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
A questão
Agora, obviamente, da maneira como o código é escrito aqui, um novo delegado é criado para cada processo. Eu estou supondo que a imutabilidade é relevante se você tentar fazer coisas como
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal);
que deve ... ainda compilar quando thisIsATest
é imutável? Então, que problema a Microsoft resolveu tornando-a imutável? Quais problemas encontraríamos se o C # 6 tornasse os delegados mutáveis?
EDITAR
Acredito que a imutabilidade impedirá isso:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest.ChangeTheDelegateInABadFashion();
someFunction(thisIsATest); //This function works as normal
//because the delegate is unchanged
//due to immutability
mas a imutabilidade NÃO impedirá isso:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest = new ProcessBookDelegate(ChangeTheDelegateInABadFashion());
someFunction(thisIsATest); //This function works weird now because
//it expected the unchanged delegate
Estou correto neste entendimento?
Func<int>
que retornasse 1 o primeiro quando é chamado, 2 o segundo, etc. - isso se comporta essencialmente como um objeto mutável.