我的问题有点类似于这个问题:How to convert an action to a defined delegate of the same signature?
为什么具有相同签名的委托(delegate)之间没有隐式转换。例如代码:
class Program
{
private delegate void Foo1(int x);
private delegate void Foo2(int x);
static void Main(string[] args)
{
Foo1 foo1 = Console.WriteLine;
Foo2 foo2 = Console.WriteLine;
Call(foo1);
Call2(foo2);
}
static void Call(Action<int> action)
{
action(10);
}
static void Call2(Foo1 action)
{
action(10);
}
}
它没有编译因为there isn't implicit convertion from Action<int> to Foo1.
但通常情况下是一样的。所以这意味着这些名称是别名,而不是实际名称。所以我认为把它当作别名来考虑是个好主意。所以在这种情况下,我们有 3 个别名 delegate, that get one int value and returns nothing
.这些委托(delegate)可以完全互换。但是我们没有。所以问题是:为什么?通过签名它是同一件事,并且没有任何实现,所以具有相同签名的委托(delegate)是一个并且具有许多别名......
是C#缺陷还是有原因?至于我,我没有看到。
最佳答案
这两个委托(delegate)之间没有隐式转换,原因与这两种类型之间没有隐式转换相同:
public sealed class Foo1
{
public string Value { get; set; }
}
public sealed class Foo2
{
public string Value { get; set; }
}
仅仅因为两个类具有相同的字段并不意味着您应该能够将一个类视为另一个类。同样的逻辑适用于委托(delegate)(请注意,委托(delegate)也是类型)。
该类型的创建具有语义意义。如果有人创建了一个 Foo1
,他们希望它是一个 Foo1
,而不是一个 Foo2
。如果他们不顾一切地使用 Foo1
而应该是 Foo2
,这是一个很大的危险信号,即使类型看起来相似,也存在语义这两种类型的区别。如果程序员知道编译器不知道的事情,他们可以使用某种显式转换来表明他们知道自己在做什么。
(上一段是有意编写的,以同样适用于您的委托(delegate),以及我在上面提供的类(class)。)
关于c# - 具有相同签名的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18390169/