1

我有这个简单的代码:

public ArrayStack(int capacity)
    {
        Contract.Requires(capacity >= 0);
        Contract.Ensures(_items != null);
        Contract.Ensures(_items.Length == capacity);
        _items = new T[capacity];
        _top = -1;
    }

我预计一旦我键入以下内容,我会收到一个编译时警告,但我只会从合约中得到一个运行时异常。

static void Main(string[] args)
    {
        int i = -1;
        ArrayStack<string> stack = new ArrayStack<string>(i);

    }

有任何想法吗?

已编辑:我的代码合同设置图片 在此处输入图像描述

4

2 回答 2

2

弄清楚了。

似乎编译器太聪明了,在最后一行之后没有人使用堆栈,所以他没有检查它。

一旦我添加 stack.push(...) 它会给我错误...

不能让电脑太聪明...

于 2012-05-22T12:03:44.403 回答
1

如果你想要波浪线,那么你必须检查'显示波浪线':

在此处输入图像描述

重新构建项目,等待静态分析完成,您将在“输出”窗口中看到两个警告(如果您没有运行 VS 的“终极”版本,这些很容易错过)和行在可疑代码下。

[编辑] 顺便说一句,我总是以“标准合同要求”装配模式运行。

然后在示例构建之后: 在此处输入图像描述

在 IDE 中:

在此处输入图像描述

于 2012-05-22T11:56:52.020 回答