与 null 比较时的 C# Contract.Result 类型

发布于 2025-01-06 05:28:17 字数 504 浏览 0 评论 0原文

令人烦恼的是 Contract.Result 在某些情况下无法计算出其类型。请参阅下面的手册摘录。

方法返回值 在后置条件中,可以通过表达式 Contract.Result() 引用方法的返回值,其中 T 替换为返回类型该方法的。当编译器无法推断类型时,必须显式给出它。 例如,C# 编译器无法推断不带任何参数的方法的类型。

我注意到代码片段 cen 生成 Contract.Ensures(Contract .Result() != null); 突出显示字符串以进行编辑。

我是否遗漏了一些东西,或者我可以在与 null 进行比较时将类型设置为 Object 吗? 即Contract.Ensures(Contract.Result() != null);

It is annoying than Contract.Result can not work out its type in some situations. See extract from manual below.

Method Return Values Within postconditions the method's return value can be referred to via the expression Contract.Result<T>(), where T is replaced with the return type of the method. When the compiler is unable to infer the type it must be explicitly given. For instance, the C# compiler is unable to infer types for methods that do not take any arguments.

I have noticed that code snippet cen produces Contract.Ensures(Contract.Result<String>() != null); With String highlighted for edit.

Am I missing something, or can I just set the type to Object when comparing to null.
i.e. Contract.Ensures(Contract.Result<Object>() != null);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烂人 2025-01-13 05:28:17

我本以为根据 OO 理论是这样的。如果我们有可为空的类型。那么 null 符合所有(可空)类型。因此它应该有效,所以我编写了下面的测试。

using NUnit.Framework;
using System.Diagnostics.Contracts;

namespace Tests
{
    [TestFixture]
    class EnsureResult_nunit
    {
        [Test]
        public void testA()
        {
            var z = str1();
            var y = str2();
        }

        [Test, ExpectedException]
        public void testB()
        {
            var z = str3();
        }

        [Test, ExpectedException]
        public void testC()
        {
            var y = str4();
        }


        public string str1() 
        {
            Contract.Ensures(Contract.Result<Object>() != null);
            return "";
        }

        public string str2()
        {
            Contract.Ensures(Contract.Result<Object>() == null);
            return null;
        }

        public string str3()
        {
            Contract.Ensures(Contract.Result<Object>() == null);
            return "";
        }

        public string str4()
        {
            Contract.Ensures(Contract.Result<Object>() == null);
            return "";
        }
    }
}

所有测试都通过了。

I would have thought that according to OO theory. That if we have nullable types. Then null conforms to all (nullable) types. Therefore it should work, so I wrote the tests below.

using NUnit.Framework;
using System.Diagnostics.Contracts;

namespace Tests
{
    [TestFixture]
    class EnsureResult_nunit
    {
        [Test]
        public void testA()
        {
            var z = str1();
            var y = str2();
        }

        [Test, ExpectedException]
        public void testB()
        {
            var z = str3();
        }

        [Test, ExpectedException]
        public void testC()
        {
            var y = str4();
        }


        public string str1() 
        {
            Contract.Ensures(Contract.Result<Object>() != null);
            return "";
        }

        public string str2()
        {
            Contract.Ensures(Contract.Result<Object>() == null);
            return null;
        }

        public string str3()
        {
            Contract.Ensures(Contract.Result<Object>() == null);
            return "";
        }

        public string str4()
        {
            Contract.Ensures(Contract.Result<Object>() == null);
            return "";
        }
    }
}

All tests passed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文