代表签名相同

时间:2013-08-22 20:25:06

标签: c# .net oop delegates clr

我的问题与此问题有点相似:How to convert an action to a defined delegate of the same signature?

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

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的别名。这个代表可以完全互换。但我们没有它。所以问题是:为什么?通过签名它是一样的,并且没有任何实现,所以具有相同签名的委托是一个并且具有许多别名...

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

应用于创建该类型的语义含义。如果有人创建了Foo1,他们希望它是Foo1,而不是Foo2。如果他们不顾一切地使用期望Foo1的{​​{1}},那么这是一个很大的红旗,即使类型看起来相似,这两种类型之间也存在语义差异。如果程序员知道编译器没有的东西,他们可以使用某种显式转换来表明他们知道他们在做什么。

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