我有一个定义为
的泛型方法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>("");
答案 0 :(得分:5)
这不是事实,有两个类型参数,它是从不推断泛型返回类型的事实。 C#不支持返回值的类型推断。此外,如果明确指定类型参数,则必须指定所有这些参数。不支持仅指定一些参数并让类型推断得出其余参数。
至于为什么不支持仅指定部分类型参数,它主要是语言设计决策。支持它我遇到的一个问题是:它需要更改语法,因为如果你有以下两个函数:
TOut Foo<TOut, TIn>(TIn arg) { ... }
string Foo<TIn>(TIn arg) { ... }
电话
string s = Foo<string>("bar")
在两者之间是不明确的,你需要特殊的语法来指定你想要的那个。目前不存在这样的歧义,因为方法定义和调用中的类型参数的数量必须完全匹配。设计C#的人认为花费额外支持的用例太少了。
例如,如果在函数参数中使用两个类型参数,C#将能够很好地推导出类型。