在 .NET 中定义泛型方法时,编译器可能无法推断返回类型,即使输入类型已知。发生这种情况是因为基本设计原则将类型信息流限制为从内部表达式到最外层表达式的单一方向。
双向类型推断的含义
如果在泛型方法中推断返回类型,则可能会出现复杂的情况,其中类型解析变得不明确且计算成本高昂。考虑以下示例:
// Multiple overloads for N with different argument types N(G(5)); // How many inferences should be made for R? // Conditional expression returning different types double x = b ? G(5) : 123; // Should R be inferred as int or double? // Nested function calls and overloads N(N(b ? G(5) : 123)); // Combinatorial explosion of possibilities to consider
在这些情况下,确定 G 的返回类型需要分析调用者的上下文并考虑多种场景,从而导致潜在的可能性组合爆炸。编译器通过强制执行单向类型信息流规则来避免这种复杂性。
Lambda 中的类型信息流
与泛型方法相比,类型信息流对于 lambda,在两个方向上。此功能支持 LINQ 等功能,编译器会考虑所有可能的重载和参数类型来解决重载问题。然而,当 lambda 的类型取决于周围上下文时,重载解析的复杂性会显着增加。
结论
限制泛型方法中的返回类型推断是一项设计决策,简化类型解析并防止潜在的组合爆炸。这一决定确保了 .NET 类型系统的效率和可预测性。虽然在某些情况下可能需要显式指定返回类型,但它最终会增强 .NET 应用程序的可靠性和性能。
以上是为什么 C# 不推断泛型方法中的返回类型?的详细内容。更多信息请关注PHP中文网其他相关文章!