LxL*_*LxL 1 c# generics .net-4.5
我有一个定义为通用的方法
void Foo<TIn>(TIn inValue)
{
//Do something here with inValue
}
Run Code Online (Sandbox Code Playgroud)
我可以通过任何一种方式调用此方法
Foo<string>("foo"); or Foo("foo");
Run Code Online (Sandbox Code Playgroud)
但是如果我有一个定义为的方法
TOut Bar<TOut,TIn>(TIn inValue)
{
//assume we return an object type of TOut here
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能再像这样使用隐式TIn调用Bar
int result= Bar<int>("");
Run Code Online (Sandbox Code Playgroud)
这不是事实,有两个类型参数,它是从不推断泛型返回类型的事实.C#不支持返回值的类型推断.此外,如果明确指定类型参数,则必须指定所有这些参数.不支持仅指定一些参数并让类型推断找出其余参数.
至于为什么不支持仅指定部分类型参数,它主要是语言设计决策.支持它我遇到的一个问题是:它需要更改语法,因为如果你有以下两个函数:
TOut Foo<TOut, TIn>(TIn arg) { ... }
string Foo<TIn>(TIn arg) { ... }
Run Code Online (Sandbox Code Playgroud)
电话
string s = Foo<string>("bar")
Run Code Online (Sandbox Code Playgroud)
两者之间是不明确的,你需要特殊的语法来指定你想要的那个.目前不存在这样的歧义,因为方法定义和调用中的类型参数的数量必须完全匹配.设计C#的人认为花费额外支持的用例太少了.
例如,如果在函数参数中使用两个类型参数,C#将能够很好地推导出类型.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |