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 に答える