7

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

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

这需要IntPtr与 的大小相同Int32。所以我想要一个编译时断言——就像这个 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)));

我通过falseAssert()所以它肯定会失败,但编译通过就好了。

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

4

1 回答 1

2

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

看看这个问题,它看起来已经很好地回答了这个问题:Contract.Assert 不要抛出编译错误

于 2013-07-24T20:42:32.797 回答