我刚刚发现在C#中将编译以下内容
public void Exec<T>(T t) => Console.WriteLine(t.ToString());
你可以称之为
Exec(1);
Exec(new SomeClass());
我觉得有趣的是你可以省略括号中的参数类型并仍然获得类型安全性(如果你向T添加了约束)。这是一个新功能吗?这看起来很漂亮
答案 0 :(得分:4)
这称为泛型类型推断(see here)。编译器可以看到您传入int
或SomeClass
,因此推断泛型类型。举个例子:
public void DoStuff<T, U>(T param1, U, param2) { ... }
您可以这样称呼它:
DoStuff(1, "hello");
事实上,您可能已经使用过此功能,甚至没有意识到这一点。所有Linq方法都是通用类型,因此,只要您使用Where
,Count
或Select
,就可以指定类型。现在你能想象代码看起来有多丑吗?例如:
var list = new List<string>();
var filteredList1 = list.Where<string>(s => s == "hello");
var filteredList2 = list.Where(s => s == "hello");
然而,这是怎么回事:
public TOutput DoStuff<TInput, TOutput>(TInput param1) { ... }
如果在没有指定类型的情况下调用它,则只允许编译器推断第一个泛型类型,因此您将收到编译器错误:
CS0411方法&#39; DoStuff(TInput)&#39;的类型参数无法从使用中推断出来。尝试明确指定类型参数。