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

Aar*_*ide 9 c# type-inference

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

public TTo Convert<TTo, TFrom>(TFrom from)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样称呼:

SomeType someType = converter.Convert(someOtherType);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 23

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

static void M(int x){}
static void M(double x){}
static T N<T>() {}
...
M(N());
Run Code Online (Sandbox Code Playgroud)

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

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

从内到外的推理很难.从外到内推理要困难得多,同时做两件事都非常困难.如果它是很难的编译器,了解正在发生的事情,想象它是多么困难的人试图阅读,理解和调试代码时的推论都可以做表达式的上下文的类型.这种推理使程序更难理解,而不是更容易,因此将它添加到C#是一个坏主意.

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

  • @Gabriel:当然,人们总是要求这样做.如果您正在寻找一种允许您更改语言基本行为的语言,请考虑使用Python; 我听说这对你有好处. (3认同)