33

我想为这个通用接口指定一个合同,使用代码合同:

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

似乎类型参数不能与属性一起使用。

如何为的通用接口编写合同?还是代码合同不可能做到这一点?

4

2 回答 2

45

正如此问题中的其他评论所述,您应该从属性使用中删除泛型类型标识符,因为它无法在编译时解决:

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 
于 2010-01-27T23:16:27.997 回答
1

好问题,但是您可以看到此限制背后的技术原因,对吧?

您无法指定 ContractClass 的原因是因为Blah<T>它不是一个类。

如果您可以通过为 指定值来为具体类创建接口T,即使我确信这是次优的。

于 2010-01-27T23:04:49.603 回答