代码之家  ›  专栏  ›  技术社区  ›  mafu

codecontracts:如何使用此()调用满足ctor中的要求?

  •  1
  • mafu  · 技术社区  · 16 年前

    我正在玩微软的codecontracts,遇到了一个我无法解决的问题。我有一个包含两个构造函数的类:

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

    这个例子被简化了。我不知道如何检查第二个构造函数 f 因为是>0。这在合同中是可能的吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   koenmetsu    15 年前

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

    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);
    

    您将看到在抛出常规异常之前抛出了前提条件。

        2
  •  1
  •   Community Mohan Dere    7 年前

    我将添加一个静态方法,该方法将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;
        }
    }
    

    希望这有帮助。