Bien que la plupart des autres réponses soient correctes au niveau sémantique, je trouve intéressant d'aborder également ce type de questions au niveau des détails de l'implémentation.
Une interface peut être considérée comme une collection d' emplacements contenant des méthodes . Lorsqu'une classe implémente une interface, la classe doit indiquer au runtime comment remplir tous les emplacements requis. Quand tu dis
interface IFoo { void M(); }
class Foo : IFoo { public void M() { ... } }
la classe dit "lorsque vous créez une instance de moi, remplissez une référence à Foo.M dans l'emplacement pour IFoo.M.
Ensuite, lorsque vous passez un appel:
IFoo ifoo = new Foo();
ifoo.M();
le compilateur génère du code qui dit "demandez à l'objet quelle méthode se trouve dans l'emplacement pour IFoo.M, et appelez cette méthode.
Si une interface est une collection d'emplacements qui contiennent des méthodes, certains de ces emplacements peuvent également contenir les méthodes get et set d'une propriété, les méthodes get et set d'un indexeur et les méthodes add et remove d'un événement. Mais un champ n'est pas une méthode . Il n'y a pas de "fente" associée à un champ que vous pouvez ensuite "remplir" avec une référence à l'emplacement du champ. Et par conséquent, les interfaces peuvent définir des méthodes, des propriétés, des indexeurs et des événements, mais pas des champs.