C#是否支持返回类型的类型推断?

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

public TTo Convert(TFrom from) { ... } 

这样称呼:

 SomeType someType = converter.Convert(someOtherType); 

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

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

现在什么是T? int还是double?

当你知道你所分配的类型是什么时,解决问题就很容易了,但是你分配的类型大部分时间都是你想要解决的问题。

从内到外的推理是很难的。 从外到内推理要困难得多,同时做两件事都非常困难 。 如果编译器很难理解发生了什么,想象一下当人们在表达式的上下文类型中进行推断时,尝试读取,理解和调试代码的难度。 这种推理使程序更难理解,而不是更容易 ,因此将它添加到C#是一个坏主意。

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

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

你要求的表达式的类型由它所分配的任何东西决定; 那会违反这个原则。

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

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

因为没有人设计,指定,实施,测试,记录和发送该function