C# 为什么这里不能暗示泛型for type参数(有两个类型参数)?

C# 为什么这里不能暗示泛型for type参数(有两个类型参数)?,c#,generics,.net-4.5,C#,Generics,.net 4.5,我有一个泛型方法定义为 void Foo<TIn>(TIn inValue) { //Do something here with inValue } TOut Bar<TOut,TIn>(TIn inValue) { //assume we return an object type of TOut here } void Foo(无效) { //在这里做点什么 } 我可以用任何一种方式调用这个方法 Foo<string>("foo"

我有一个泛型方法定义为

void Foo<TIn>(TIn inValue)
{
    //Do something here with inValue
}
TOut Bar<TOut,TIn>(TIn inValue)
{
     //assume we return an object type of TOut here
}
void Foo(无效)
{
//在这里做点什么
}
我可以用任何一种方式调用这个方法

Foo<string>("foo"); or Foo("foo");
Foo(“Foo”);或Foo(“Foo”);
但是如果我有一个定义为

void Foo<TIn>(TIn inValue)
{
    //Do something here with inValue
}
TOut Bar<TOut,TIn>(TIn inValue)
{
     //assume we return an object type of TOut here
}
TOut酒吧(锡瓦卢)
{
//假设我们在这里返回TOut的对象类型
}
为什么我再也不能像这样用隐式锡来称呼酒吧了

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

不是因为有两个类型参数,而是因为一般返回类型永远不会被推断出来。C#不支持返回值的类型推断。此外,如果显式指定类型参数,则必须指定所有类型参数。不支持仅指定部分参数,并让类型推断找出其余参数

至于为什么不支持只指定一部分类型参数,这在很大程度上取决于语言设计。支持它的一个问题是:它需要修改语法,因为如果有以下两个函数:

TOut Foo<TOut, TIn>(TIn arg) { ... }
string Foo<TIn>(TIn arg) { ... }
toutfoo(tinarg){…}
字符串Foo(TIn arg){…}
电话

string s = Foo<string>("bar")
string s=Foo(“bar”)
这两者之间是不明确的,您需要特殊的语法来指定所需的语法。目前,方法定义和调用中的类型参数的数量必须完全匹配,因此不存在这种模糊性。设计C#的人认为,很少有用例会花费精力来添加对C#的支持


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

不是因为有两个类型参数,而是因为一般返回类型永远不会被推断出来。C#不支持返回值的类型推断。此外,如果显式指定类型参数,则必须指定所有类型参数。不支持仅指定部分参数,并让类型推断找出其余参数

至于为什么不支持只指定一部分类型参数,这在很大程度上取决于语言设计。支持它的一个问题是:它需要修改语法,因为如果有以下两个函数:

TOut Foo<TOut, TIn>(TIn arg) { ... }
string Foo<TIn>(TIn arg) { ... }
toutfoo(tinarg){…}
字符串Foo(TIn arg){…}
电话

string s = Foo<string>("bar")
string s=Foo(“bar”)
这两者之间是不明确的,您需要特殊的语法来指定所需的语法。目前,方法定义和调用中的类型参数的数量必须完全匹配,因此不存在这种模糊性。设计C#的人认为,很少有用例会花费精力来添加对C#的支持


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

我的问题是为什么“不支持只指定部分参数并让类型推断出其余参数”。?@LxL:更新了我的答案。我的问题是为什么“不支持只指定部分参数,让类型推断找出其余参数。”?@LxL:更新了我的答案。