C#委托参数类型

问题描述 投票:1回答:1
    delegate void Dele(string str);
    delegate void Alli(int num);

    class Program
    {
        static void Main(string[] args)
        {
            Dele dele = Test; // O
            Alli alli = Test; // X          
        }        

        static void Test(object obj) { }
    } 

Alli alli = Test; // X为什么???

也许......str as object(O)num as object(X)???

(对不起,我英语不太好)(看来您的帖子大部分是代码;请添加更多详细信息。:确定)

c# delegates
1个回答
2
投票

此行为在C#语言规范中指定。

这里:

Dele dele = Test;

您正在执行method group conversion。允许进行方法组转换的要求之一是

所选的方法M必须与委托类型D兼容(代理兼容性),否则会发生编译时错误。

[Delegate compatibility被这样指定(强调我):

如果方法或委托M都符合以下条件,则它与委托D类型兼容以下是正确的:

  • D和M具有相同数量的参数,并且D中的每个参数与M中的相应参数具有相同的ref或out修饰符。
  • 对于每个值参数(没有ref或out修饰符的参数),标识转换(Identity conversion)或隐式参考转换(隐式参考转换)来自D中的参数类型与M中的相应参数类型。
  • 对于每个ref或out参数,D中的参数类型与M中的参数类型相同。
  • 存在从M的返回类型到D的返回类型的标识或隐式引用转换。

存在isstringobject的隐式引用转换,因为stringobject的子类,但是不是int的隐式引用转换。到objectint是值类型,因此转换实际上是装箱转换。因此,方法组转换不适用于AlliTest

© www.soinside.com 2019 - 2024. All rights reserved.