1 回答
TA贡献1752条经验 获得超4个赞
应用什么规则来选择其两种通用方法之一?
规范中的规则 - 不幸的是,这些规则非常复杂。在ECMA C# 5 标准中,相关位从第 12.6.4.3 节(“更好的函数成员”)开始。
但是,在这种情况下,它相对简单。两种方法都适用,每种方法都分别进行类型推断:
对于方法1,
TEnum
推断为List<MyEnum>
对于方法2,
TEnum
推断为MyEnum
接下来,编译器开始检查从参数到参数的转换,以查看一种转换是否比另一种“更好”。这进入第 12.6.4.4 节(“更好地从表达式转换”)。
在这一点上,我们正在考虑这些转换:
重载 1:
List<MyEnum>
toList<MyEnum>
(TEnum
推断为List<MyEnum>
)重载 2:
List<MyEnum>
toIEnumerable<MyEnum>
(TEnum
推断为MyEnum
)
幸运的是,第一条规则可以帮助我们:
给定从表达式 E 转换为类型 T1 的隐式转换 C1 和从表达式 E 转换为类型 T2 的隐式转换 C2,如果以下至少一项成立,则 C1 是比 C2 更好的转换:
E 具有类型 S 并且存在从 S 到 T1 但不存在从 S 到 T2 的身份转换
还有就是从身份转换List<MyEnum>
到List<MyEnum>
,但不是一个身份转换List<MyEnum>
到IEnumerable<MyEnum>
,因此第一次转换是更好的。
没有任何其他转换需要考虑,因此重载 1 被视为更好的函数成员。
如果此早期阶段以抢七局结束,您关于“更一般”与“更具体”参数的论点将是有效的,但事实并非如此:在“更具体的参数”之前考虑参数到参数的“更好的转换” .
一般来说,两种重载解析都非常复杂。它必须考虑继承、泛型、无类型参数(例如空字面量、默认字面量、匿名函数)、参数数组、所有可能的转换。几乎每次向 C# 添加新功能时,它都会影响重载解析 :(
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报