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 do not throw compilation error

于 2013-07-24T20:42:32.797 に答える