void
構築可能でなく、ジェネリック型として許可されないことを支持して設計上の決定は何でしたか?結局それだけで特別な空であるstruct
と明確な持つの合計PITA避けているだろうFunc
し、Action
デリゲートを。
(C ++は明示的なvoid
戻り値を許可void
し、テンプレートパラメータとして許可します)
void
構築可能でなく、ジェネリック型として許可されないことを支持して設計上の決定は何でしたか?結局それだけで特別な空であるstruct
と明確な持つの合計PITA避けているだろうFunc
し、Action
デリゲートを。
(C ++は明示的なvoid
戻り値を許可void
し、テンプレートパラメータとして許可します)
回答:
「void」の基本的な問題は、他の戻り値型と同じことを意味しないことです。「void」は、「このメソッドが戻る場合、値をまったく返さない」ことを意味します。ヌルではありません。nullは値です。値をまったく返しません。
これは本当に型システムを台無しにします。型システムは、本質的に、特定の値に対して有効な操作を論理的に推論するためのシステムです。voidを返すメソッドは値を返さないため、「この操作で有効な操作は何か?」まったく意味がありません。有効または無効の操作が行われるための「もの」はありません。
さらに、これにより、ランタイムが非常に激しくなります。.NETランタイムは、スタックマシンとして指定された仮想実行システムの実装です。つまり、評価スタックへの影響という点ですべての操作が特徴付けられている仮想マシン。(もちろん、実際にはマシンはスタックとレジスタの両方を備えたマシンに実装されますが、仮想実行システムはスタックのみを想定しています。)voidメソッドの呼び出しの効果は基本的に非voidメソッドの呼び出しの効果とは異なります。非voidメソッドは常にスタックに何かを置くため、ポップする必要があるかもしれません。voidメソッドは、スタックに何かを置くことはありません。したがって、コンパイラは、メソッドの戻り値が無視される場合、voidメソッドと非voidメソッドを同じように処理できません。メソッドがvoidの場合、戻り値はないため、ポップはありません。
これらすべての理由から、「void」はインスタンス化できる型ではありません。値がありません。それがポイントです。オブジェクトに変換することはできません。また、voidを返すメソッドは、voidを返さないメソッドで多態的に扱うことはできません。
したがって、voidを型引数として使用することはできません。これは、ご存知のように残念です。とても便利でしょう。
後知恵の恩恵により、ボイドを返すメソッドが魔法のシングルトン参照型である「Unit」を自動的に返した場合、何もするのではなく、関係者全員にとってより良いことでした。その後、すべてのメソッド呼び出しがスタックに何かを置くことを知っているでしょう、あなたはすべてのメソッド呼び出しがオブジェクト型の変数に割り当てることができる何かを返すことを知っているでしょう、そしてもちろんUnitは型引数として使用できるので、 ActionおよびFuncデリゲートタイプを個別に持つ必要はありません。悲しいことに、それは私たちがいる世界ではありません。
この流れについてのさらなる考えについては、以下を参照してください。
Void
、0スタックバイト内で無限量の引数として渡されても問題ありません。構造体の変換object
またはメソッドの取得(取得this
)が必要な場合Type
、メモリのフィールド領域の前に参照を挿入してヒープに配置してボックス化し(多くのCLR実装の場合)、適切に処理できます。私に関しては、タイプは、いくつかの特性(フィールド)によって区別できるオブジェクトのグループ化にすぎません。Void
ただ一つのオブジェクトです。
void
空の値型の場合、そのステートメントはマシンコードのゼロ命令に変換されます。のハードコードされた型にはあまり有用ではありませんVoid
が、型に複数のジェネリックパラメーターがあるが、特定の場合には一部のパラメーターが不要な場合に役立ちます。
From:http : //connect.microsoft.com/VisualStudio/feedback/details/94226/allow-void-to-be-parameter-of-generic-class-if-not-in-c-then-just-in-ランタイム
これは実際には設計によるものです-void型のインスタンスは許可されません(ランタイムでは他の多くの型と一緒に)。また、voidまたはvoid []をCreateInstanceすることもできません。セキュリティのためにこれらのタイプの穴を塞いだ。
私の人生では、ボイドがセキュリティホールであるかどうかはわかりませんが、...と言っています。