2017-01-31 1 views
0

다음과 같은 사용자 지정 NUnit 제약이 있습니다. 그것은 (적절하게 구현 될 때) 시험은 주어진 내일 DateTime과 동일합니다.일반적인 인수가 적용되지 않습니다.

public class TomorrowConstraint : Constraint 
{ 
    public TomorrowConstraint() 
    { 
     Description = "Tomorrow"; 
    } 

    public override ConstraintResult ApplyTo<DateTime>(DateTime actual) 
    { 
     return new ConstraintResult(this, actual, true); 
    } 
} 

Type 매개 변수에 제네릭 형식이 아닌 구체적인 형식이 지정되었습니다.

시험은 아래를 활용 : 그러나 문자열이 문제없이 메서드에 전달

[TestFixture] 
public class X 
{ 
    [Test] 
    public void Foo() 
    { 
     Assert.That("string", new TomorrowConstraint()); 
    } 
} 

나는 string 전달있어하는 DateTime하지.

actual.GetType()으로 유형을 보면 문자열이라는 것을 알 수 있습니다 : {Name = "String" FullName = "System.String"}.

어떻게 된 일입니까?

나는 어딘가에 예외가 있다고 생각 했겠습니까? 좋아

+2

당신은 DateTime''에 대해서 typeof'actual' 구속되지 않은 : 당신이 할 수있는 것은 그 방법의 DateTime 버전을 호출하는 다른 방법이 당신의 단위 테스트를 위해 그것을 사용하는 것입니다 제네릭 매개 변수를'ApplyTo''DateTime'에 추가합니다. 대신 'T'라고 부르는 경우에도 똑같이 작동합니다. 'actual'에있는'DateTime' 멤버들 ('object'에 의해 정의 된 멤버들 옆)에 접근하려고 시도하면 타입 오류가 발생합니다. – Lee

답변

0

, 내가 추측 리는 확인 된, DateTime을 할

public override ConstraintResult ApplyTo<DateTime>(DateTime actual) 

는 제네릭 형식을 제한하지 않는 선. 대신 DateTime을 일반 매개 변수의 식별자 (예 : T)로 사용합니다. 제네릭 형식 제약 조건이 인터페이스 또는 비 봉인 클래스가 될하기 때문에 것을 제외하고
public override ConstraintResult ApplyTo<T>(T actual) where T : DateTime 

...

이 중 하나가 작동하지 않을, 그리고 : 실제로 제네릭 형식을 제한하려면 where 키워드를 사용해야합니다 DateTime은 밀봉되어 있습니다. 따라서 generics 만 사용하여 컴파일 타임 타입 안전성을 얻는 방법이 있는지 확실하지 않습니다. 방금 이름을 지정하는

public ConstraintResult ApplyTo(DateTime actual) 
{ 
    return ApplyTo<DateTime>(actual); 
} 
+0

'where' 제약 조건을 제외하고 당신 말이 맞습니다. 값 타입에'where'를 사용할 수 없습니다 (bar all'struct'). – BanksySan

+0

@BanksySan 그 이유는 값 유형 (구조체)이 암시 적으로 봉인 되었기 때문입니다. – Abion47

+0

나는 'where T : DateTime'을 가질 수 없다는 것을 의미합니다. – BanksySan

관련 문제