C++ には、コンパイルはできるが未定義の動作をもたらすコードを作成する方法がたくさんあります(Wikipedia)。C#に似たようなものはありますか? コンパイルはできるが未定義の動作をするコードを C# で記述できますか?
7 に答える
はい!安全なコンテキストでもあります!(まあ、少なくとも未定義であると定義された実装です)
これは、 Roslyn issuesの Marek Safar と VSadov からのものです。に関して、C# と CLI の間に不一致がありますbool
。
C#true
では、 は 1 種類しかなく、 も1 種類しかないと考えられていfalse
ます。
CLI はfalse
0 を含むバイトであると認識し、他のすべての値はtrue
.
この不一致は、 C# に(わずかに) 興味深いことを強制できることを意味します。
//non-standard bool
//We're setting a bool's value to a byte value of 5.
var a = new bool[1];
Buffer.SetByte(a, 0, 5);
//non-standard bool
//We're setting a bool's value to a byte value of 10.
var b = new bool[1];
Buffer.SetByte(b, 0, 10);
//Both are true.
Console.WriteLine(a[0]);
Console.WriteLine(b[0]);
//But they are not the same true.
Console.WriteLine(a[0] == b[0]);
上記の出力:
true
true
false
興味深いことに、デバッガーは同意しません (真実を異なる方法で評価する必要がありますか?)
とにかく、C# チームが到達したと思われる結論は次のとおりです (強調を追加)。
IE 言語は、非標準の bool についてはまったく気にしません。特定の実装 (CIL 上の MS C# など) は、非標準ブール値の存在を認識し、それらの動作を未定義として指定します。
ウィキペディアの未定義の動作に関する記事を見ると、未定義の動作が発生する状況は許可されていないか、C# で例外がスローされます。
ただし、Unsafe コードでは、ポインターなどを使用できるため、未定義の動作が可能であると私は信じています。
編集:私が正しいようです:http://msdn.microsoft.com/en-us/library/aa664771%28VS.71%29.aspx
C#で未定義の動作の例があります
ECMA-334ドキュメント(p。473)によると:
安全でない修飾子の出現を含まないプログラムは、未定義の動作を示すことはできません。
これにより、「実装定義」が最悪の場合に促進されます。EricLippertの回答を参照してください。
多くのサブプログラムには、次のように要約できる要件があります。
有効なデータを指定すると、有効な出力が生成されます。
たとえ無効な情報が与えられたとしても、核ミサイルを発射したり、時間と因果関係の法則を否定したりすることは控えてください。
Java 言語と .NET 言語の主な設計目標の 1 つは、「安全でない」とマークされている特定の言語をコードで使用しない限り、通常、上記の 2 番目の制約を満たすために特に努力する必要がないことです [ただし、ガベージ コレクションとFinalize
時間/因果関係の観点からは少し奇妙かもしれませんが、それらは因果関係の完全な取り消しではなく、通常の因果関係のルールの例外として説明できます]。この状況は、多くの種類のデータ依存エラー (整数オーバーフローなど) が原因で、オーバーフローを回避するために必要な仮定を行うなど、任意の方法でコンパイラが動作する可能性がある C の状況とは大きく異なります。ハイパーモダンな C 哲学で奨励されている本当に恐ろしい種類の未定義の動作は、「安全でない」ブロックの外側にある C# やその他の .NET 言語には存在しません。
正確にはWikiの意味ではありませんが、頭に浮かぶ最も明白な例は、単純にスレッド化されたコードを書くことだと思いますが、それはどの言語でも同じです.