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

sta*_*ica 33 .net generics interface code-contracts

我想使用代码合同为此通用接口指定合同:

interface IRandomWriteAccessible<T>
{
    T this[uint index] { set; }
    uint Length { get; }
}
Run Code Online (Sandbox Code Playgroud)

文档ContractClass说明在为接口指定合同时使用该属性.但是,编译器会抱怨这个:

[ContractClass(typeof(IRandomWriteAccessibleContract<T>))]
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     <-- compiler error
interface IRandomWriteAccessible<T> { … }

[ContractClassFor(typeof(IRandomWriteAccessible<T>))]
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^          <-- compiler error
sealed class IRandomWriteAccessibleContract<T> : IRandomWriteAccessible<T> { … }
Run Code Online (Sandbox Code Playgroud)

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

如何我写我的通用接口一份合同吗?或者代码合同无法实现这一点吗?

Ste*_*idi 45

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

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 
Run Code Online (Sandbox Code Playgroud)

  • 另外,如果你是typeof()的泛型类需要多个参数,你必须使用逗号; 例如,typeof(YourType <,>),其中YourType采用两个类型参数. (15认同)
  • 出于好奇,我在C#语言规范中查了一下:相关章节是_14.5.11(typeof operator)_和_25.5(泛型:构造类型)_,如果有其他人感兴趣的话. (5认同)