Кодовые контракты. Как я могу предоставить класс контракта для общего интерфейса?
Я хотел бы указать контракт для этого общего интерфейса, используя 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
, хотя я уверен, что это не оптимально.