为什么ref和out不足以消除C#中的重载歧义?

Tom*_*duy 5 .net c# methods

例如,为什么这种方法Max(ref int x, ref int y)不被认为是超载Max(int x, int y)?为什么一样out

jas*_*son 14

这个问题预示着一个错误的前提.

 Max(int x, int y)
 Max(ref int x, ref int y) 
 Max(out int x, out int y)
Run Code Online (Sandbox Code Playgroud)

都是名为的方法的重载Max.但是,请注意,在任何给定的类定义中,最后两个中只有一个可能存在.从规范§3.6:

方法的签名包括方法的名称,类型参数的数量以及每个形式参数的类型和种类(值,引用或输出),按从左到右的顺序考虑.出于这些目的,在形式参数的类型中出现的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识.方法的签名特别不包括返回类型,params可以为最右边的参数指定的修饰符,也不包括可选的类型参数约束.

[...]

虽然outref参数修饰符被认为是签名的一部分,但是在单一类型中声明的成员只能通过ref和签名out.如果在具有out修饰符的两个方法中的所有参数都更改为ref修饰符的情况下,如果两个成员在同一类型中声明具有相同签名的成员,则会发生编译时错误.用于签名匹配的其他目的(例如,隐藏或覆盖),ref并且out被认为是签名的一部分并且彼此不匹配.(此限制是为了允许C#程序轻松转换为在公共语言基础结构(CLI)上运行,这不提供定义仅在ref和中区别的方法的方法out.)