2013-04-15 4 views
1

방금 ​​코드 계약으로 게임을 시작 했으므로 유망한 반면 값 유형과 관련하여 몇 가지 제한 사항이있는 것 같습니다. 예 :값 형식에 대한 코드 계약

public struct Wrap<T> 
    where T : class 
{ 
    readonly T value; 
    public Wrap(T value) 
    { 
     Contract.Requires(value != null); 
     this.value = value; 
    } 
    public T Value 
    { 
     get 
     { 
      Contract.Requires(Value != null); 
      return value; 
     } 
    } 
    [Pure] 
    [ContractInvariantMethod] 
    void Invariant() 
    { 
     Contract.Invariant(value != null); 
    } 
    public static T BigError() 
    { 
     Contract.Ensures(Contract.Result<T>() != null); 
     var x = default(Wrap<T>); 
     Contract.Assert(x.Value != null); 
     return x.Value; 
    } 
} 

Wrap.BigError가 문제를 명확히 보여줍니다. 이 샘플은 4 개의 어설 션을 컴파일하고 확인하지만, 어설 션은 런타임에 분명히 실패합니다. 이러한 어설 션 중 일부는 중복되어 있으며이를 삽입하면 검증자가 지정된 지점에서 이러한 특성을 확인하고 있습니다.

나는 MS's docs for code contracts에 알려진 문제로 나열된 이런 종류의 것을 보지 못했지만, 생략하기 란 너무 분명한 것처럼 보입니다. 내가 놓친 게 있니?

+1

"다음은 정적 계약 검사기의 알려진 버그 또는 구현되지 않은 기능 목록입니다. ** 알려진 제한 사항 ** 구조체의 불변 값은 무시됩니다." (6.6.1에서) –

+0

고마워, 나는 그걸 놓쳤다. 만족스럽지 않은 전제 조건을 나열했기 때문에 여전히 질문에 답하지 않습니다. – naasking

+0

어떤 전제 조건이 충족되지 않습니까? –

답변

0

구조체에 지정된 불변성이 문제가되었습니다. 불변성을 제거하면 예상되는 오류가 발생합니다. MS의 문서와는 달리, 정적 체커는 struct invariants를 설명하는 것처럼 보입니다.

0

Value 속성에 대한 getter 계약에는 이상한 점이 있습니다. 재귀 적으로 this.Value! = null을 요구합니다. 네가 뭔가 다른 것을 의미했다고 확신한다.

Contract.Ensures(Contract.Result<T>() != null); 

해당 수정 사항은 사양이 저에게 매우 합리적입니다. (런타임을 포함하여) 검사기의 한계는 구조체의 기본값을 항상 만들 수 있으며 이러한 기본값에서 불변성을 검사 할 수 없다는 것입니다. 따라서 검사는 기본값을 구성하는 법입니다.

+0

아니요, 사용자가 기본 struct 인스턴스를 사용하지 않도록 null 값이 아닌지 재귀 적으로 요구했습니다. 이러한 계약의 요점은 클라이언트가 생성자를 통해 구조체를 생성하도록 요구하는 것이 었습니다. 참조 : http://higherlogics.blogspot.ca/2013/04/impressions-of-code-contracts.html – naasking

+0

본인의 의도는 이해하지만 그렇게는 작동하지 않습니다. 사람들이 인스턴스화 된 구조체를 사용하도록하려면 실제 생성자에 설정된 필드 및 속성'Initialized'를 추가하십시오. 그런 다음 모든 메소드를'Requires (this.Initialized)'로 만드십시오. 고통 스럽지만, 당신이하려는 일이라고 생각합니다. –

+0

작동하지 않습니다. 링크 된 블로그 게시물을 참조하십시오. 프로퍼티가 public 인 동안, 전제 조건은 여기에서했던 것처럼 재귀 적으로 지정 될 수 있으며 유효하지 않은 사용을 발견하면 정적 체커는 오류를 반환합니다. – naasking