c# - 如何使用代码契约在 C# 中进行编译时断言?

标签 c# code-contracts static-assert

根据 this answer 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)));

我将 false 传递到 Assert() 中,这样它肯定会失败,但编译会顺利通过。

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

最佳答案

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

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

关于c# - 如何使用代码契约在 C# 中进行编译时断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17741240/

相关文章:

c# - "Object Reference"未在实体容器上设置保存更改

c# - C# 中的正则表达式,负向后视中的表达式

c# - .Net 代码契约(Contract) - 在哪里可以了解更多信息?

c# - 我如何暗示链接方法的代码契约以避免链接时的多余检查?

code-contracts - 在 AppHarbor 上使用代码合约构建

c# - 加快迭代两个 foreach 循环

c# Winform richtextbox字体差异

c++ - 结合静态断言和断言?

c++ - 静态断言和 SFINAE

c++ - 如何用宏做static_assert?