C# 代码契约-静态检查器不';无法获取可为空的类型?
我想我在静态契约检查工具中发现了一个bug。除了用C# 代码契约-静态检查器不';无法获取可为空的类型?,c#,.net,nullable,code-contracts,verification,C#,.net,Nullable,Code Contracts,Verification,我想我在静态契约检查工具中发现了一个bug。除了用[ContractVerification(false)]标记整个项目外,还有其他方法吗 class Employee { public int? HierarchyLevel { get; private set; } public Employee(int? level) { Contract.Requires<ArgumentException>( (!level
[ContractVerification(false)]
标记整个项目外,还有其他方法吗
class Employee
{
public int? HierarchyLevel { get; private set; }
public Employee(int? level)
{
Contract.Requires<ArgumentException>(
(!level.HasValue)
||
level >= 0 && level <= 10);
Contract.Ensures(
(!HierarchyLevel.HasValue)
||
(HierarchyLevel.Value >= 0 && HierarchyLevel.Value <= 10));
this.HierarchyLevel = level; //unproven
// this doesnt work either
//if (!level.HasValue) {
// this.HierarchyLevel = new Nullable<int>();
//} else {
// this.HierarchyLevel = new Nullable<int>(level.Value);
//}
// can't even make the static checker shut up with that:
//Contract.Assume(
// (!HierarchyLevel.HasValue)
// ||
// (HierarchyLevel.Value >= 0 && HierarchyLevel.Value <= 10));
}
}
class员工
{
public int?HierarchyLevel{get;private set;}
公共雇员(国际级)
{
合同。需要(
(!level.HasValue)
||
level>=0&&level=0&&HierarchyLevel.Value=0&&level=0&&HierarchyLevel首先,您在代码中放错了一些大括号(但这并不能解决您的问题):
class Employee2
{
public int HierarchyLevel { get; private set; }
public bool HasLevel { get; private set; }
public Employee2(int level, bool hasLevel)
{
Contract.Requires<ArgumentException>(!hasLevel || level >= 0 && level <=10);
if (hasLevel) {
HasLevel = true;
HierarchyLevel = level;
} else {
HasLevel = false;
HierarchyLevel = -1;
}
}
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(
(!HasLevel) ||
(HierarchyLevel >= 0 && HierarchyLevel <= 10));
}
}
Contract.Requires<ArgumentException>(!level.HasValue
|| (level.Value >= 0 && level.Value <= 10));
Contract.Ensures(!HierarchyLevel.HasValue
|| (HierarchyLevel.Value >= 0 && HierarchyLevel.Value <= 10));
Contract.Requires<ArgumentException>(!level.HasValue
|| (level.Value >= 0 && level.Value <= 10);
Contract.Ensures(HierarchyLevel == level);
[Pure]
public static bool IsInRange(int? value)
{
return !value.HasValue
|| (value >= 0 && value <= 10);
}
public Employee(int? level)
{
Contract.Requires<ArgumentException>(IsInRange(level));
Contract.Ensures(IsInRange(HierarchyLevel));
this.HierarchyLevel = level;
}