代码合同:如何为通用接口提供合同类?

时间:2010-01-27 23:01:43

标签: .net generics interface 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> { … }

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

如何我为我的通用界面写了一份合约?或者代码合同无法实现这一点吗?

2 个答案:

答案 0 :(得分:45)

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

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 

答案 1 :(得分:1)

很好的问题,但你可以看到这个限制背后的技术原因,对吗?

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

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