我对 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
返回值,这是完全公平的,但在我看来,编译器仍然可以通过简单地忽略返回值来生成类型安全的代码,甚至可能能够优化这种情况。
显然,如果情况颠倒过来,并Foo
指定 a string
be returned 和Test
returned void
,我们就会遇到问题。所以,我完全同意这种情况会导致编译器错误。但是,为什么不能int Test(string)
隐式匹配委托void Foo(string)
?
我正在寻找两个可能的答案之一:一个,允许这种能力的逻辑问题。是否存在通过委托调用方法时忽略返回类型会导致不安全情况的情况?或者,第二,对 C# 规范的引用,它阐明了为什么此实现会违反规范。