c# - 具有相同签名的委托(delegate)

标签 c# .net oop delegates clr

我的问题有点类似于这个问题: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/

相关文章:

c# - VS2010中可执行文件中的多个图标

C# 立方体/多维数据集

c# - ASP.NET Web 应用程序 - 在部署时,System.Speech.dll 对象未设置为对象的实例

c# - 获取通用词典指定值的多个键?

c# - 是否可以定义一个可以具有泛型方法的非泛型接口(interface)?

php - 如何在父类构造函数中使用命名空间

c# - MySqlCommand.LastInsertedId 返回 0

c# - 是否可以将 ASP.NET 应用程序部署为桌面应用程序(带有服务器组件)

python - 从静态方法访问静态变量

c# - 比较字符串