Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的合同格式不正确,用C代码?_C#_C# 4.0_Code Contracts_Microsoft Contracts - Fatal编程技术网

C# 为什么我的合同格式不正确,用C代码?

C# 为什么我的合同格式不正确,用C代码?,c#,c#-4.0,code-contracts,microsoft-contracts,C#,C# 4.0,Code Contracts,Microsoft Contracts,当我在下面编写此合同时,VisualStudio显示了一个错误 错误20方法“…获取页面”中的合同部分格式错误 if块有问题吗 public int? Page { get { int? result = Contract.Result<int?>(); if (result != null) Contract.Ensures(result >= 0); return default(int?); } } 只是猜猜而已。

当我在下面编写此合同时,VisualStudio显示了一个错误

错误20方法“…获取页面”中的合同部分格式错误

if
块有问题吗

public int? Page
{
  get
  {
    int? result = Contract.Result<int?>();

    if (result != null)
        Contract.Ensures(result >= 0);

    return default(int?);
  }
}

只是猜猜而已。也许应该是
Contract.surveures(result.Value>=0)

您不需要if来执行布尔操作,而是使用implies

public int? Page
{
    get
    {
        Contract.Ensures( (result!= null).Implies(result >= 0) );
        var result = ...

        ...


        return result;
    }
}
在测试方法参数和其他前提条件时,还应该使用Requires not assert

public int IndexOf(T item)
{
    Contract.Requires(item != null);
    Contract.Requires((item as IEntity).ID > 0);
...

合同格式不正确,因为所有合同条款必须出现在任何其他代码之前。

合同上有条件编译标志。 在发布更多代码时

if condition
    contract
return
变成

if condition
   return

您现在看到问题了吗?

所有确保和要求调用必须在方法或属性体中的所有其他语句之前,这包括简单的赋值,例如您正在使用的帮助可读性的赋值

正确的语法

public int? Page {
    get {
        Contract.Ensures(Contract.Result<int?>() == null 
            || Contract.Result<int?>() >= 0); 

        return default(int?);
        }
    }
 }
EnsuresNullOrPositive
也可以保存在静态类中,并在整个项目中重用,或者公开并放置在实用程序库中。您还可以使其更一般,如下一个示例所示

[ContractAbbreviator]
static void EnsuresNullOrPositive<Nullable<T>>(Nullable<T> obj) {
    Contract.Ensures(
        Contract.Result<Nullable<T>>() == null ||                 
        Contract.Result<Nullable<T>>() >= default(T));
}
它们可以这样使用:

public int? Page {
    get {
        EnsuresNullOrPositive();
        return default(int?)
    }
}

[ContractAbbreviator]
static void EnsuresNullOrPositive(int? x) {
    Contract.Ensures(
        Contract.Result<int?>() == null ||                 
        Contract.Result<int?>() >= 0);
}
public List<SentMessage> EmailAllFriends(Person p) {
    Requires.NotNull(p); //check if object is null
    Requires.NotNullOrEmpty(p.EmailAddress); //check if string property is null or empty
    Requires.NotNullOrEmpty(p.Friends); //check if sequence property is null or empty
    Ensures.NotNull(); //result object will not be null

    //Do stuff
}
公开列表EmailAllFriends(个人p){
Requires.NotNull(p);//检查对象是否为null
Requires.NotNullOrEmpty(p.EmailAddress);//检查string属性是否为null或空
Requires.NotNullOrEmpty(p.Friends);//检查sequence属性是null还是空
确保.NotNull();//结果对象将不为null
//做事
}
ContractArgumentValidator属性
我没有在教程之外使用过这个函数,但基本上它允许您在一个调用中编写多个
if(test)throw new ArgumentException()
调用,其行为类似于对
Contract.Requires的调用。因为它只处理参数验证,所以对post条件示例没有帮助。

那么:Contract.assures(result==null | | result>=0)呢?老实说,我还没有看过C#4.0的代码契约,我仍然忙于C#3.0和.NET3.5的工作。但是,如果将其称为“合同”的目的只是为了说明这一点,那么请记住,规定合同何时有效的标准写在合同中,而不是合同之外。你没有一份合同规定其他合同何时有效。所以对我来说,这听起来一定是这样的,你必须写一个契约来指定什么时候一切都是美好的,并且契约不能依赖于外部条件。嗯,结果实际上可以是空的。对,所以也许
(result==null | | result>=0)
?更一般地说,如果x那么y
!x | | y
,所以我们有了
!(result!=null)| | result>=0
这简化为
result==null | | result>=0
。更一般地说,暗示“如果x那么y”是“x.Implies(y)”,所以这里我们有“(result!=null)。暗示(result>=0)”是的,在C中,所有契约都从一开始。(在《埃菲尔铁塔》中,要求在开始时走,确保在结束时走。)暗示的确切来源是什么?Surveures是一个无效的方法,因此不能在之后使用任何虚线符号…@bkqc
暗示
未在
上调用Surveures
它是
bool的方法(或bool的扩展方法)。对!我应该学习阅读:P我想象了一个额外的括号lol。这是在.Net核心中吗?因为我在.NET框架的任何地方都找不到它。你能告诉我它所在的dll/程序集吗(可能是F12)?
public static class Requires {

    [ContractAbbreviator] 
    public static void NotNull(object obj) {  
        Contract.Requires<ArgumentNullException>(obj != null);
    }

    [ContractAbbreviator]
    public static void NotNullOrEmpty(string str) {
        Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(str));
    }

    [ContractAbbreviator]
    public static void NotNullOrEmpty(IEnumerable<T> sequence) {
        Contract.Requires<ArgumentNullException>(sequence != null);
        Contract.Requires<ArgumentNullException>(sequence.Any());
    }
}

public static class Ensures {
    [ContractAbbreviator]
    public static void NotNull(){
        Contract.Ensures(Contract.Result<object>() != null);
    }
}
public List<SentMessage> EmailAllFriends(Person p) {
    Requires.NotNull(p); //check if object is null
    Requires.NotNullOrEmpty(p.EmailAddress); //check if string property is null or empty
    Requires.NotNullOrEmpty(p.Friends); //check if sequence property is null or empty
    Ensures.NotNull(); //result object will not be null

    //Do stuff
}