C#委托参数类型

    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#语言规范中指定。

这里:

Dele dele = Test;

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

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

委托兼容性是这样指定的(强调我的):

如果满足以下所有条件,则方法或委托M与委托类型D兼容:

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

这里从隐式引用转换stringobject,因为string是的一个子类object,但有没有隐式引用转换从intobjectint是值类型,因此转换实际上是装箱转换因此,方法组转换不适用于AlliTest

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章