【问题标题】:Does C# support type inference of the return type?C# 是否支持返回类型的类型推断?
【发布时间】:2012-03-19 02:44:21
【问题描述】:

这只是一个好奇,如果有一个基本的事情阻止这样的事情(或者如果已经有办法纠正我):

public TTo Convert<TTo, TFrom>(TFrom from)
{
    ...
}

这样称呼:

SomeType someType = converter.Convert(someOtherType);

【问题讨论】:

  • @aqwert:他在问他们为什么不能添加这样的功能。

标签: c# type-inference


【解决方案1】:

因为如果你这样做会发生什么?

static void M(int x){}
static void M(double x){}
static T N<T>() {}
...
M(N());

现在什么是 T?整数还是双精度?

当您知道要分配给的类型是什么时,解决问题就很容易,但很多时候您要分配的类型就是您自己的东西'试图首先弄清楚

从内到外的推理已经够难了。从外到内的推理要困难得多,同时做这两件事是极其困难的。如果编译器很难理解正在发生的事情,想象一下当推断可以从 em> 和 to 表达式上下文的类型。这种推断使程序更难理解,而不是更容易,因此将其添加到 C# 中是个坏主意。

现在,也就是说,C# 确实通过 lambda 表达式支持此功能。当面临 lambda 可以以两种、三种或 一百万 种不同方式绑定的重载解决问题时,我们将其绑定两种、三种或一百万种不同方式,然后评估这百万种不同的可能绑定以确定哪个是“最好的”。这使得 C# 中的重载解析至少是 NP-HARD,我花了一年的大部分时间来实现。我们愿意进行这项投资,因为 (1) lambda 非常棒,并且 (2) 大多数时候人们编写的程序可以在合理的时间内进行分析并且可以被人类理解。所以这是值得的。但总的来说,这种高级分析是不值得的。

【讨论】:

  • 编译器中内置的钩子/拦截器的想法是否曾经浮出水面?即如果你想编译我的问题这样的代码,你可以处理/解决停止编译器的错误
  • @Gabriel:当然,人们一直要求这样做。如果您正在寻找一种允许您更改语言基本行为的语言,请考虑使用 Python;我听说这很好。
  • 无法编译,因为T 在这种情况下是不可推导出的。
【解决方案2】:

C# 表达式始终*具有固定类型,无论其周围环境如何。

您要求一个表达式,其类型由分配给它的任何内容决定;这将违反此原则。

*) 除了 lambda 表达式、函数组和 null 文字。

【讨论】:

  • 如果 C# 语言被设计成“环境”包含左值类型,那么它是可能的......那为什么不呢? ;-) 我真的不想要/不需要答案,但它可能更符合海报的意图(和你的帖子评论)。
【解决方案3】:

与 Java 不同,C# 中的类型引用不基于返回类型。不要问我为什么,Eric Lippert 已经回答了这些“为什么 C# 不能……”的问题:

因为从来没有人设计、指定、实施、测试过, 记录并发布该功能

【讨论】:

  • 它也复杂得多。想象一下,当结果被使用或者结果类型“target”符合多个重载时......
  • @pst: 如果结果没有被使用或者匹配了一些重载,他们(c#团队)必须定义一个规则,就像C#中的霸主M(object o) M(int o)目前。这种设计很有意义(Java 使用它)。
  • 当这种情况发生时,你会得到类似 C++ 的 SFINAE 的东西。因为我们真的需要另一个 turing tarpit 来玩玩。
猜你喜欢
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多