问题
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?
回答1:
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<>))]
回答2:
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