I'd like to specify a contract for this generic interface, using Code Contracts:
interface IRandomWriteAccessible<T>
{
T this[uint index] { set; }
uint Length { get; }
}
The documentation says to use the ContractClass
attribute when specifying a contract for an interface. However, the compiler will complain about this:
[ContractClass(typeof(IRandomWriteAccessibleContract<T>))]
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- compiler error
interface IRandomWriteAccessible<T> { … }
[ContractClassFor(typeof(IRandomWriteAccessible<T>))]
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- compiler error
sealed class IRandomWriteAccessibleContract<T> : IRandomWriteAccessible<T> { … }
It seems that type parameters cannot be used with attributes.
How do I write a contract for my generic interface? Or is this not possible with Code Contracts?
As mentioned by other comments in this question, you should remove the generic type identifier from your attribute usage as it can not be resolved at compile time:
[ContractClass(typeof(IRandomWriteAccessibleContract<>))]
Good question, but you can see the technical reasons behind this limitation, right?
The reason that you can't specify the ContractClass is because Blah<T>
is not a class.
If you can make an interface for a concrete class by specifying a value for T
, even though I'm sure this is sub-optimal.
来源:https://stackoverflow.com/questions/2150983/code-contracts-how-do-i-supply-a-contract-class-for-a-generic-interface