Почему статические classы не реализуют интерфейсы?

Возможный дубликат:
Почему C # не позволяет статическим методам реализовать интерфейс?

В моем приложении я хочу использовать repository, который будет выполнять необработанный доступ к данным (TestRepository, SqlRepository, FlatFileRepository и т. Д.). Поскольку такой repository будет использоваться в течение всего времени выполнения моего приложения, мне показалось разумным сделать его статическим classом, чтобы я мог пойти

SqlRepository.GetTheThingById(5); 

без необходимости его регенерации все время. Поскольку я хочу, чтобы мои репозитории были взаимозаменяемыми, я хочу, чтобы они реализовали общий интерфейс: IRepository. Но когда я пытаюсь это сделать, я получаю

 "Static classes cannot implement interfaces" 

Почему они не могут? Как вы предлагаете мне изменить свой дизайн? Есть ли образец, который я мог бы использовать?

ОБНОВИТЬ
Пять лет спустя: этот вопрос посещается 20k + раз, я узнал о недостатках шаблона репозитория, узнал о IoC и понял, что мой вопрос был плохо сформулирован.

Я действительно не спрашивал, что такое спецификация интерфейса C #, а почему именно намеренно ограничивает меня этим конкретным способом.

Практический ответ заключается в том, что синтаксис вызова метода на экземпляр или тип различен. Но вопрос закрыт.

Интерфейсы не могут иметь статические методы. Класс, реализующий интерфейс, должен реализовать их как методы экземпляра. Статические classы не могут иметь методы экземпляра. QED.

Может быть, наш опыт поможет. Вместо SqlRepository в качестве статического classа мы используем AutoFac для инъекций и скрываем контейнер за статическим classом. Тогда каждый объект имеет свойство статического репозитория:

 public class Part : inheritence... { public static IPartRepository Repository { get { return IoCContainer.GetInstance>(); } } // ... more part-y stuff } 

Таким образом, мы можем поменять местами реализацию, и звонящие всегда знают, где ее получить:

 Part p = Part.Repository.Get(id); 

В другом проекте есть PartRepository, зарегистрированный в контейнере:

 public class PartRepository : IPartRepository { // IPartRepository implementation that talks to injected DAL } 

В еще одном проекте у нас есть mocks для тестирования, включая репозитории, предварительно загруженные известными:

 public class MockPartRepository : Dictionary, IPartRepository { // IPartRepository implementation based on dictionary } 

… и он зарегистрирован в контейнере для модульного тестирования. Тот же самый вызов получает repository:

 Part p = Part.Repository.Get(id); 

По определению интерфейсы создают контракт для выполнения экземпляров. Поскольку вы не можете создавать статический class, статические classы не могут реализовывать интерфейсы.

Нет необходимости иметь статический repository. Просто сделайте его нестатичным и создайте его, когда вам это нужно.