为什么在 .NET 中无法推断泛型方法的返回类型
在 .NET 中,泛型方法无法推断其返回类型。强制执行此限制是为了防止类型推断在表达式中“双向”流动,这可能导致可能的类型组合的组合爆炸。
示例
考虑以下泛型方法:
static TDest Gimme<TSource, TDest>(TSource source) { return default(TDest); }
如果允许返回类型推断,则以下代码将是valid:
string dest = Gimme(5);
但是,此代码会导致编译器错误,因为无法从参数类型 int 推断出 Gimme 的返回类型。
推理
此限制背后的原因是为了防止类型信息从表达式内部和外部流动的情况。考虑以下场景:
场景 1:多次重载
假设我们有十个具有不同参数类型的方法 N 重载。如果我们允许泛型方法的返回类型推断,我们将需要推断表达式 N(G(5)) 中 G 的返回类型。这需要考虑 N 的所有十个重载并选择“最佳”一个。然而,确定“最佳”重载的标准并不明确,从而导致潜在的歧义。
场景 2:条件表达式
考虑表达式 double x = b ? G(5) : 123. 如果允许返回类型推断,我们需要根据条件表达式的类型(double)确定 G 的返回类型。但是,这并没有考虑到 G 的返回类型可能需要隐式转换为条件表达式的参数类型 (int) 的可能性。
场景 3:嵌套表达式
如果我们组合多个条件表达式和方法调用,例如表达式 N(N(b ? G(5) * G("hello") : 123)),返回类型推断的复杂度呈指数级增长。我们需要考虑 G 和 N 组合中所有可能的重载,从而导致可能的类型组合爆炸。
结论
通过禁止泛型的返回类型推断方法,.NET 可以防止这些组合爆炸并确保类型推断以可预测且一致的方式进行。
以上是为什么 .NET 无法推断泛型方法中的返回类型?的详细内容。更多信息请关注PHP中文网其他相关文章!