【问题标题】:How do I use Code Contracts to have a compile time assert in C#?如何使用代码合同在 C# 中进行编译时断言?
【发布时间】:2013-07-19 08:15:39
【问题描述】:

根据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(),这样它肯定会失败,但编译通过就好了。

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

【问题讨论】:

  • 它仍然没有正确地折叠到 C# 中 - 尽管 Contracts 类在 mscorlib 中,但您仍然必须单独安装然后启用合同检查。没有迹象表明 VS2013 已经支持,而且插件也没有更新。
  • 顺便说一句,Code Contracts extension 上周更新为支持 VS2013。

标签: c# code-contracts static-assert


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多