加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#-4.0 – 为什么我不能以覆盖的方法添加Contract.Requires?

发布时间:2020-12-15 06:14:31 所属栏目:百科 来源:网络整理
导读:我正在使用代码合同(实际上,学习使用这个). 我正在面对一些奇怪的东西,我覆盖了一个在第三方大会定义的方法.我想添加一个Contract.Require语句,如下所示: public class MyClass: MyParentClass{ protected override void DoIt(MyParameter param) { Contrac
我正在使用代码合同(实际上,学习使用这个).

我正在面对一些奇怪的东西,我覆盖了一个在第三方大会定义的方法.我想添加一个Contract.Require语句,如下所示:

public class MyClass: MyParentClass
{
    protected override void DoIt(MyParameter param)
    {
        Contract.Requires<ArgumentNullException>(param != null);

        this.ExecuteMyTask(param.Something);
    }

    protected void ExecuteMyTask(MyParameter param)
    {
        Contract.Requires<ArgumentNullException>(param != null);
        /* body of the method */
    }
}

但是,我收到如下警告:

Warning 1 CodeContracts:
Method ‘MyClass.DoIt(MyParameter)’ overrides ‘MyParentClass.DoIt(MyParameter))’,thus cannot add Requires.

[编辑]更改代码一点显示替代问题[/编辑]

如果我在DoIt方法中删除了Contract.Requires,我会收到另一个警告,告诉我我必须提供未经证实的param!= null
我不明白这个警告.是什么原因,我可以解决吗?

解决方法

您不能添加您的呼叫者可能不知道的额外要求.它违反了 Liskov’s Subtitution Principle.多态的观点是,一个调用者应该能够将一个引用实际引用到派生类的一个实例,就像它引用基类的一个实例一样.

考虑:

MyParentClass foo = GetParentClassFromSomewhere();
DoIt(null);

如果这是静态确定为有效的,您的派生类可以握住它是错误的,并说“不,你不打算用空论调用DoIt!”合同静态分析的目的是,您可以在编译时确定调用,逻辑等的有效性,因此在执行时不需要添加额外的限制,这是由于多态而发生的.

派生类可以添加关于它将做什么的保证 – 它将确保什么 – 但是它不能再提供来自其重载方法的呼叫者的更多要求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读