如何使用代码约定在C#中使用编译时断言?

时间:2013-07-19 08:15:39

标签: c# code-contracts static-assert

根据this answer C#现在有“代码契约”,应该可以使用而不是C ++编译时断言。现在我有了这个神奇的代码:

IntPtr pointer;
//blahblahblah
pointer = new IntPtr(pointer.ToInt32() + Marshal.SizeOf(typeof(SomeStruct)));

要求IntPtrInt32的尺寸相同。所以我想要一个编译时断言 - 就像这个C ++代码

static_assert(sizeof(IntPtr)==sizeof(Int32))

所以我尝试了以下内容:

System.Diagnostics.Contracts.Contract.Assert(false); //just to test it
pointer = new IntPtr(pointer.ToInt32() + Marshal.SizeOf(typeof(SomeStruct)));

我将false传递给Assert(),这样肯定会失败,但编译通过就好了。

那么我如何使用代码契约来使编译时断言?

1 个答案:

答案 0 :(得分:1)

这是因为代码契约与编译时断言不同。它们仍然是运行时代码,但它们还带有静态分析规则集,您可以在项目中启用它来执行您要查找的内容。

看看这个看起来已经很好地回答了这个问题的问题:Contract.Assert do not throw compilation error