Ale*_*kin 1 c# linq generics extension-methods
只是出于好奇:
许多LINQ扩展方法存在的通用和非通用的变种,例如Any和Any<>,Where和Where<>等写我的疑问,我通常使用非通用变种,它工作正常.
当必须使用通用方法时会出现什么情况?
---编辑---
PS:我知道内部只调用泛型方法,编译器尝试<>在编译期间解析通用括号的内容.我的问题是什么案例然后必须明确提供类型而不依赖编译器的直觉?
总是.C#编译器非常智能,可以根据参数推断出方法的类型.当类型是匿名的,因此没有名称时,这很重要.
obj.SomeMethod(123); //these calls are the same
obj.SomeMethod<int>(123);
obj.SomeMethod(new { foo = 123 }); //what type would I write here?!
Run Code Online (Sandbox Code Playgroud)
编辑:要清楚,您总是调用泛型方法.它看起来像一个非泛型方法,因为编译器和智能感知是聪明的.
编辑:对于更新的问题,如果要使用的类型不是要传递的对象的类型,则可能需要特定.有两种这样的情况:
如果参数实现了一个接口,并且您希望在该接口上操作,而不是具体类型,那么您应该指定接口:
obj.DoSomething<IEnumerable<Foo>>( new List<Foo>() );
Run Code Online (Sandbox Code Playgroud)如果参数可以隐式转换为另一种类型,并且您想使用第二种类型,那么您应该指定它:
obj.DoSomethingElse<long> ( 123 ); //123 is actually an int, but convertible to long
Run Code Online (Sandbox Code Playgroud)在另一方面,如果你需要一个投来进行转换(或插入一个反正),那么你并不需要指定:
obj.DoYetAnotherThing( (Transformed)new MyThing() ); // calls DoYetAnotherThing<Transformed>
Run Code Online (Sandbox Code Playgroud)