タイプとしては無効。一体なぜ「ボイド」タイプなのでしょうか?インスタンスも値もありません。ジェネリック型の引数、仮パラメータ型、ローカル型、フィールド型、またはプロパティ型として使用することはできません。型としての意味はありません。むしろ、メソッド呼び出しが仮想マシンのスタックに与える影響についての事実です。しかし、仮想マシンはまさにそれです。仮想マシンです。実際のマシンは返された値をレジスタ(通常はx86のEAX)に格納し、スタックにはまったく影響を与えません!型としてのVoidは、あらゆる点で悪い考えです。
さらに悪いことに、ポインタ型で使用する場合は、まったく異なるvoid*
ものを意味します戻り値の型として使用した場合、それが何を意味するのかよりを。現在では、「不明な型の格納場所へのポインタ」を意味し、「値を返さないメソッド」としての意味とは何の関係もありません。
void*
ポインタ型としてに置き換えることができますIntPtr
。(そして、void**
とIntPtr*
のように。)私たちは、「ユニット」、単一の値、すなわち、ヌルを持っているタイプの戻り値の型として無効置き換えることができます。CLRの実装は、ユニット型関数呼び出しがレジスタまたはスタックの使用を適切に最適化できると判断し、「返される」nullを安全に無視できることを知っています。
そのような世界では、あなたは、もはや分離必要はないFunc<A, R>
とAction<T>
のデリゲート。Action<T>
ただFunc<T, Unit>
です。