为什么这里不能隐含类型参数的泛型(有两个类型参数)?

时间:2014-09-24 21:47:46

标签: c# generics .net-4.5

我有一个定义为

的泛型方法
void Foo<TIn>(TIn inValue)
{
    //Do something here with inValue
}

我可以通过任何一种方式调用此方法

Foo<string>("foo"); or Foo("foo");

但如果我有一个定义为

的方法
TOut Bar<TOut,TIn>(TIn inValue)
{
     //assume we return an object type of TOut here
}

为什么我不能再像这样使用隐式TIn调用Bar

int result= Bar<int>("");

1 个答案:

答案 0 :(得分:5)

这不是事实,有两个类型参数,它是从不推断泛型返回类型的事实。 C#不支持返回值的类型推断。此外,如果明确指定类型参数,则必须指定所有这些参数。不支持仅指定一些参数并让类型推断得出其余参数。

至于为什么不支持仅指定部分类型参数,它主要是语言设计决策。支持它我遇到的一个问题是:它需要更改语法,因为如果你有以下两个函数:

TOut Foo<TOut, TIn>(TIn arg) { ... }
string Foo<TIn>(TIn arg) { ... }

电话

string s = Foo<string>("bar")

在两者之间是不明确的,你需要特殊的语法来指定你想要的那个。目前不存在这样的歧义,因为方法定义和调用中的类型参数的数量必须完全匹配。设计C#的人认为花费额外支持的用例太少了。

例如,如果在函数参数中使用两个类型参数,C#将能够很好地推导出类型。