代表签名相同

Ale*_*kiy 6 .net c# oop clr delegates

我的问题与此问题有点类似:如何将操作转换为相同签名的已定义委托?

为什么具有相同签名的委托之间没有隐式转换.例如,代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为there isn't implicit convertion from Action<int> to Foo1. 但是正常情况下它也是一样的.所以这意味着这个名字是别名,而不是实际名称.所以我觉得把它当成别名就好了.所以在这种情况下我们有3个a的别名delegate, that get one int value and returns nothing.这个代表可以完全互换.但我们没有它.所以问题是:为什么?通过签名它是一样的,并且没有任何实现,所以具有相同签名的委托是一个并且具有许多别名...

是C#缺陷还是有原因的?至于我,我没有看到任何.

Ser*_*rvy 3

这两个委托之间没有隐式转换,原因与这两种类型之间没有隐式转换相同:

public sealed class Foo1
{
    public string Value { get; set; }
}

public sealed class Foo2
{
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

仅仅因为两个类具有相同的字段并不意味着您应该能够将其中一个类视为另一个类。同样的逻辑也适用于委托(请注意,委托也是类型)。

有语义应用于该类型的创建。如果有人创建了 a,Foo1他们希望它是 a Foo1,而不是 a Foo2。如果他们不遗余力地在需要Foo1a 的地方使用 a Foo2,那么这是一个很大的危险信号,即使类型看起来相似,但这两种类型之间也存在语义差异。如果程序员知道编译器不知道的东西,他们可以使用某种显式转换来表明他们知道自己在做什么。

(上一段是故意编写的,以便同样适用于您的代表以及我上面提供的课程。)