Aunque muchas de las otras respuestas son correctas a nivel semántico, también me parece interesante abordar este tipo de preguntas desde el nivel de detalles de implementación.
Una interfaz puede considerarse como una colección de ranuras , que contienen métodos . Cuando una clase implementa una interfaz, se requiere que la clase le diga al tiempo de ejecución cómo completar todos los espacios requeridos. Cuando tu dices
interface IFoo { void M(); }
class Foo : IFoo { public void M() { ... } }
la clase dice "cuando creas una instancia de mí, escribe una referencia a Foo.M en el espacio para IFoo.M.
Luego, cuando haces una llamada:
IFoo ifoo = new Foo();
ifoo.M();
el compilador genera un código que dice "pregunte al objeto qué método hay en la ranura para IFoo.M, y llame a ese método.
Si una interfaz es una colección de ranuras que contienen métodos, entonces algunas de esas ranuras también pueden contener los métodos get y set de una propiedad, los métodos get y set de un indexador y los métodos add y remove de un evento. Pero un campo no es un método . No hay un "espacio" asociado con un campo que luego pueda "completar" con una referencia a la ubicación del campo. Y, por lo tanto, las interfaces pueden definir métodos, propiedades, indexadores y eventos, pero no campos.