Контракты кода: Как мне предоставить класс контракта для универсального интерфейса? - PullRequest
33 голосов
/ 28 января 2010

Я бы хотел указать контракт для этого универсального интерфейса, используя кодовые контракты:

interface IRandomWriteAccessible<T>
{
    T this[uint index] { set; }
    uint Length { get; }
}

В документации сказано использовать атрибут ContractClass при указании контракта для интерфейса. Однако компилятор будет жаловаться на это:

[ContractClass(typeof(IRandomWriteAccessibleContract<T>))]
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     <-- compiler error
interface IRandomWriteAccessible<T> { … }

[ContractClassFor(typeof(IRandomWriteAccessible<T>))]
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^          <-- compiler error
sealed class IRandomWriteAccessibleContract<T> : IRandomWriteAccessible<T> { … }

Кажется, что параметры типа нельзя использовать с атрибутами.

Как сделать Я пишу контракт для моего универсального интерфейса? Или это невозможно с Code Contracts?

Ответы [ 2 ]

45 голосов
/ 28 января 2010

Как уже упоминалось в других комментариях в этом вопросе, вы должны удалить универсальный идентификатор типа из использования вашего атрибута, поскольку он не может быть разрешен во время компиляции:

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 
1 голос
/ 28 января 2010

Хороший вопрос, но вы можете видеть технические причины этого ограничения, верно?

Причина, по которой вы не можете указать ContractClass, заключается в том, что Blah<T> не является классом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...