Кодовые контракты. Как я могу предоставить класс контракта для общего интерфейса?

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

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> { … }

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

Как написать контракт для моего общего интерфейса? Или это невозможно с кодовыми контрактами?

Ответы

Ответ 1

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

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 

Ответ 2

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

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

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