Хотя многие другие ответы верны на семантическом уровне, я нахожу интересным также подойти к этим типам вопросов с уровня детализации реализации.
Интерфейс можно рассматривать как совокупность слотов , которые содержат методов . Когда класс реализует интерфейс, класс должен сообщить среде выполнения, как заполнить все необходимые слоты. Когда вы говорите
interface IFoo { void M(); }
class Foo : IFoo { public void M() { ... } }
класс говорит: «когда вы создаете мой экземпляр, вставьте ссылку на Foo.M в слот для IFoo.M.
Тогда, когда вы делаете звонок:
IFoo ifoo = new Foo();
ifoo.M();
компилятор генерирует код, который говорит: «спросите у объекта, какой метод находится в слоте для IFoo.M, и вызовите этот метод.
Если интерфейс представляет собой набор слотов, которые содержат методы, то некоторые из этих слотов могут также содержать методы получения и установки свойства, методы получения и установки индексатора, а также методы добавления и удаления события , Но поле не является методом . Нет никакого «слота», связанного с полем, которое вы можете затем «заполнить» ссылкой на местоположение поля. И поэтому интерфейсы могут определять методы, свойства, индексаторы и события, но не поля.