私は、C# デリゲートのこの制限についてかなり興味があります。次のコードはコンパイルされません。
class Program
{
delegate void Foo(string s);
static void Main(string[] args)
{
Foo f = Test; // Error
f("Hello");
}
static int Test(string s)
{
return s.Length;
}
}
ここでのエラーは、デリゲートFoo
に戻り値の型がないため、関数への参照を作成するために使用できないことTest
です。
しかし、なぜこれが問題なのですか?Test
明らかに、デリゲートを介して呼び出す場合f
、それらはの戻り値にアクセスできません。これは完全に公平ですが、コンパイラは戻り値を単に無視するだけでタイプセーフなコードTest
を生成できるように思えます。そのケースを最適化できること。
明らかに、状況が逆で、 be return とreturn をFoo
指定した場合、問題が発生します。したがって、その場合はコンパイラ エラーが発生することに完全に同意します。しかし、デリゲートを暗黙的に一致させることができないのはなぜですか?string
Test
void
int Test(string)
void Foo(string)
考えられる 2 つの答えのうちの 1 つを探しています。1 つは、この機能を許可することの論理的な問題です。デリゲートを介してメソッドを呼び出すときに戻り値の型を無視すると、安全でない状態が発生する場合はありますか? または、2 つ目は、この実装が仕様に違反する理由を明確にする C# 仕様への参照です。