CodeContracts:如何使用 this() 调用来满足 Ctor 中的 Require?

发布于 2024-07-29 07:09:48 字数 279 浏览 8 评论 0原文

我正在使用 Microsoft 的 CodeContracts 并遇到了无法解决的问题。 我有一个带有两个构造函数的类:

public Foo (public float f) {
    Contracts.Require(f > 0);
}
public Foo (int i)
    : this ((float)i)
{}

该示例已简化。 我不知道如何检查第二个构造函数的 f 是否 > 0. 这对于合约来说可能吗?

I'm playing around with Microsoft's CodeContracts and encountered a problem I was unable to solve. I've got a class with two constructors:

public Foo (public float f) {
    Contracts.Require(f > 0);
}
public Foo (int i)
    : this ((float)i)
{}

The example is simplified. I don't know how to check the second constructor's f for being > 0. Is this even possible with Contracts?

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

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

发布评论

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

评论(2

病毒体 2024-08-05 07:09:48

您只需将前提条件添加到第二个构造函数的主体中即可。

public TestClass(float f)
{
    Contract.Requires(f > 0);
    throw new Exception("foo");
}
public TestClass(int i): this((float)i)
{
    Contract.Requires(i > 0);
}

编辑

尝试使用以下代码调用上面的代码:

TestClass test2 = new TestClass((int)-1);

您将看到在引发常规异常之前引发先决条件。

You can just add the precondition to the second constructor's body.

public TestClass(float f)
{
    Contract.Requires(f > 0);
    throw new Exception("foo");
}
public TestClass(int i): this((float)i)
{
    Contract.Requires(i > 0);
}

EDIT

Try calling the code above with:

TestClass test2 = new TestClass((int)-1);

You will see that the precondition is thrown before the regular Exception is thrown.

画中仙 2024-08-05 07:09:48

我将添加一个静态方法,将 int 转换为 float 并在其中包含 Contract.Requires

class Foo
{
    public Foo(float f)
    {
        Contract.Requires(f > 0);
    }

    public Foo(int i) : this(ToFloat(i))
    {
    }

    private static float ToFloat(int i)
    {
        Contract.Requires(i > 0);
        return i;
    }
}

希望这可以帮助。

I would add a static Method that converts the int to the float and include the Contract.Requires in there.

class Foo
{
    public Foo(float f)
    {
        Contract.Requires(f > 0);
    }

    public Foo(int i) : this(ToFloat(i))
    {
    }

    private static float ToFloat(int i)
    {
        Contract.Requires(i > 0);
        return i;
    }
}

Hope this helps.

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