나는 기존 코드에 Code Contracts을 통합하려고하고 있으며, 지금까지는 그다지 좋은 결과를 얻지 못했습니다.Func에서 코드 계약을 정의합니다.>
[ContractClass(typeof(IFooContract))]
public interface IFoo
{
object Bar();
}
[ContractClassFor(typeof(IFoo))]
public abstract class IFooContract : IFoo
{
object IFoo.Bar()
{
Contract.Ensures(Contract.Result<object>() != null);
throw new NotImplementedException();
}
}
public class DelegatedFoo : IFoo
{
public DelegatedFoo(Func<object> barImplementation)
{
Contract.Requires(barImplementation != null);
_barImplementation = barImplementation;
}
private readonly Func<object> _barImplementation;
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(_barImplementation != null);
}
public object Bar()
{
//"ensures unproven: Contract.Result<object>() != null" here.
return _barImplementation();
}
}
정적에게 : 그래도 난에 직면하고 문제는 내가 Func을 <에 구현> 즉, 다음과 같은 클래스의 생성자에 전달되는 인터페이스와 하나의 구현 대표에 계약을 설정 한 것입니다 분석기는 "증명되지 않은 것을 보장합니다 : Contract.Result()! = null"이라는 오류를보고합니다. Func <에서 계약을 정의 할 수 있습니까 (연장 작업 : <>)?
이 것이 최선의 해결책입니까? 그래서
public class DelegatedFoo : IFoo
{
public DelegatedFoo(Func<object> barImplementation)
{
Contract.Requires(barImplementation != null);
_barImplementation = barImplementation;
}
private readonly Func<object> _barImplementation;
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(_barImplementation != null);
}
public object Bar()
{
var result = _barImplementation();
Contract.Assume(result != null);
return result;
}
}