2010-01-27 1 views
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> { … } 

유형 매개 변수는 속성과 함께 사용할 수없는 것으로 보입니다.

How do 나는 제네릭 인터페이스 계약을 맺고 있습니까? 아니면 코드 계약에서 불가능합니까?

+2

나는 이것을 확인하지 않은,하지만 제거' T '를 다음과 같이 사용합니다 :'[ContractClass (typeof (IRandomWriteAccessibleContract <>))] –

+0

@ Steve Guidi : OMG,이 변화는 실제로 컴파일러를 행복하게 만듭니다. 예상대로 실제로 작동하는지 아직 확인하지 않았습니다. 내가 더 많이 알 자마자 곧 돌아올거야. 지금까지 고마워. – stakx

+1

@ Steve Guidi : 귀하의 제안이 효과적입니다. 답변으로 다시 게시하는 경우 허용 된 답변으로 기꺼이 표시해 드리겠습니다. 도와 줘서 고마워! – stakx

답변

45

, 당신은 컴파일 시간에 해결 될 수 없기 때문에 당신의 속성 사용에서 제네릭 형식 식별자를 제거해야합니다 :

[ContractClass(typeof(IRandomWriteAccessibleContract<>))] 
+5

나는 이것을 호기심에서 C# 언어 사양으로 보았다. 관련 장은 _14.5.11 (typeof 연산자) _ 및 _25.5 (제네릭 : 생성 된 유형) _, 다른 사람이 관심이있는 경우 _입니다. – stakx

+15

또한 typeof()를 쓰는 제네릭 클래스가 둘 이상의 매개 변수를 사용하는 경우에는 쉼표를 사용해야합니다. 예를 들어, typeof (YourType <,>)입니다. 여기서 YourType은 두 가지 유형 매개 변수를 사용합니다. –

1

좋은 질문이지만이 제한의 기술적 이유를 볼 수 있습니다. 맞습니까?

Blah<T>이 클래스가 아니기 때문에 ContractClass를 지정할 수없는 이유는 다음과 같습니다.

T의 값을 지정하여 구체적인 클래스의 인터페이스를 만들 수있는 경우, 이것이 최적 이하라고 확신하지만.

이 질문에 다른 의견에서 언급 한 바와 같이
+0

글쎄, 네, 컴파일러의 관점에서 볼 때 이것이 합리적이라고 생각합니다. 나는 가능한 모든 타입'T'에 대해서 같은 계약을 지정하는 것을 느끼지 않기 때문에 어떤 종류의 일반적인 해결책이 있기를 바란다 ... – stakx

+0

@ Steve Guidi의 제안은 잘되었나? –

+0

@ John : 네, 효과가있었습니다! – stakx