C#注释代码为何编译失败?编译器无法推断方法组签名原因
为什么直接在三元运算符中使用方法组无法编译?
这本质是C#编译器对三元运算符的类型推断规则限制导致的,具体原因可以拆成几点来看:
- 方法组本身没有固定类型:像
A、B这种方法组,并不是一个具体的类型,它只是指向一组重载方法的“标识”。编译器必须有明确的目标类型(比如某个委托),才能确定把方法组转换成哪个具体的委托实例——哪怕方法只有一个重载,编译器也不会自动脑补它的类型。 - 三元运算符的类型推断要求严格:
?:运算符要求两个分支的类型必须能统一成一个共同的类型。在(true ? A : B)这个表达式里,两个分支都是无明确类型的方法组,编译器没有足够的上下文来推断它们应该转换成什么委托类型。哪怕两个方法的签名完全一致,编译器也不会主动假设要转成Func<int, string>这类委托,因为方法组可能存在重载,编译器需要明确的指令才能确定。 - 变量赋值帮编译器完成了类型推断:当你执行
var a = A;时,编译器会根据A的唯一签名,自动推断出a的类型是Func<int, string>,b同理。此时三元运算符true ? a : b的两个分支都是明确的Func<int, string>类型,自然可以直接调用(34)。
如果想让直接使用方法组的代码编译,你可以显式指定委托类型,给编译器一个明确的目标:
Console.WriteLine((true ? (Func<int, string>)A : B)(34)); // 现在可以正常编译
内容的提问来源于stack exchange,提问作者quetzalcoatulus
相关产品推荐
相关产品推荐

