[英]C# delegate argument type
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 conversions)。
- 对于每个 ref 或 out 参数,D 中的参数类型与 M 中的参数类型相同。
- 从 M 的返回类型到 D 的返回类型存在标识或隐式引用转换。
存在从string
到object
的隐式引用转换,因为string
是object
的子类,但没有从int
到object
的隐式引用转换。 int
是一个值类型,所以转换实际上是一个装箱转换。 因此,方法组转换不适用于Alli
和Test
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.