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的返回类型的标识或隐式引用转换。
这里是从隐式引用转换string
到object
,因为string
是的一个子类object
,但有没有隐式引用转换从int
到object
。int
是值类型,因此转换实际上是装箱转换。因此,方法组转换不适用于Alli
和Test
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句