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;
您正在执行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的返回类型的标识或隐式引用转换。
存在is从string
到object
的隐式引用转换,因为string
是object
的子类,但是不是从int
的隐式引用转换。到object
。 int
是值类型,因此转换实际上是装箱转换。因此,方法组转换不适用于Alli
和Test
。