Em C #, comecei a ver todos esses métodos mágicos aparecendo, sem ter o backup de uma interface. Por que isso foi escolhido?
Deixe-me explicar.
Anteriormente em C #, se um objeto implementasse a IEnumerableinterface, ele seria automaticamente iterável por um foreachloop. Isso faz sentido para mim, uma vez que é apoiado por uma interface, e se eu tivesse minha própria Iteratorfunção dentro da classe sendo iterada, eu poderia fazer isso sem me preocupar com o significado mágico de outra coisa.
Agora, aparentemente, (não tenho certeza quando), essas interfaces não são mais necessárias. Ele só precisa ter as conversões de nomenclatura corretas.
Outro exemplo é tornar qualquer objeto aguardável por ter um método nomeado exatamente GetAwaiter com algumas propriedades específicas.
Por que não criar uma interface como eles fizeram com IEnumerableou INotifyPropertyChangedapoiar esta "mágica" estaticamente?
Mais detalhes sobre o que quero dizer aqui:
http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/
Quais são os prós e os contras dos métodos mágicos, e há algum lugar online onde eu possa encontrar alguma coisa sobre por que essas decisões foram tomadas?
async/ await, isso funcionará apenas com o código que foi escrito após o .NET 4.5 ter se espalhado o suficiente para ser um destino viável ... o que é basicamente agora. Mas uma tradução puramente sintática em chamadas de método permite adicionar awaitfuncionalidade aos tipos existentes após o fato.
foreachloop no início. Há não tem sido uma exigência para o objeto a implementar IEnumerablepara foreacha obra. Foi apenas uma convenção fazer isso.