2012-01-05 3 views
-1

전문화 된 랜덤 화기 클래스를 작성 중이며 CodeContracts를 사용하여 품질을 보장하고자합니다. 전형적인 랜덤 화 방법은 상한 'max'를 수신하고 그 한계 이하의 양의 무작위 값을 반환합니다. pick()가 임의의 UInt32 반환모듈러스 (%) 연산자에 대한 CodeContracts가 실패합니까?

public int Next(int max) 
{ 
    Contract.Requires<ArgumentOutOfRangeException>(0 <= max && max <= int.MaxValue); 
    Contract.Ensures(0 <= Contract.Result<int>()); 
    Contract.Ensures(Contract.Result<int>() < maxValue); 

    return (int)(pick() % maxValue); 
} 

. 내 질문 : CodeContracts가 마지막 "보장"에 실패하는 이유는 무엇입니까?

+1

아마도 'maxValue! = max'이기 때문일 수 있습니다. –

+0

'max == 0'이면 코드가 예외를 throw합니다. max 매개 변수는 최대 값을 나타내지 않고 최대 값 + 1을 나타 내기 때문에 잘못 명명되었습니다. – CodesInChaos

+1

코드를 컴파일 할 수도 없습니다. 거기에'max'와'maxValue'가 있습니다. – CodesInChaos

답변

2

문제점을 재현 할 수 없습니다. 코드 계약은 다음 코드에 대해 불평하지 않습니다 내가 max로 대체하는 대신 형 int 별도의 변수로 maxValue을 유지하는 경우

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics.Contracts; 

namespace ContractModulo 
{ 
    class Program 
    { 
     UInt32 Pick() 
     { 
      return 0; 
     } 

     public int Next(int max) 
     { 
      Contract.Requires<ArgumentOutOfRangeException>(0 <= max && max <= int.MaxValue); 
      Contract.Ensures(0 <= Contract.Result<int>()); 
      Contract.Ensures(Contract.Result<int>() < max); 

      return (int)(Pick() % max); 
     } 

     static void Main(string[] args) 
     { 
     } 
    } 
} 

그것은 하나 불평하지 않습니다.

관련 문제