Ian*_*las 16 .net c# generics generic-method .net-3.5
好了,所以我在一个Java的人开始使用C#和我的编码,并开始做一个通用的方法和我写的运行和编译,但它违背我知道一切泛型应该如何工作的,所以我希望有人能解释这个对我来说:
所以我有一个通用的方法定义如下:
public static List<T> CopyAsList<T>(IEnumerable<T> list, Object lockObject)
{
if (list != null)
{
lock (lockObject)
{
return new List<T>(list);
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但对我来说奇怪的是我可以在没有指定的情况下调用这个泛型方法T,它会起作用:
List<String> strings = new List<string>() { "a", "b", "c"};
List<int> ints = new List<int>() { 1,2,3};
object lockObject = new object();
foreach (string s in CopyAsList(strings, lockObject))
{
Console.WriteLine(s);
}
foreach (int i in CopyAsList(ints, lockObject))
{
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
如何在没有指定泛型类型的情况下编译代码?C#是否在运行时推断出类型?
Fem*_*ref 35
不,它是在编译时推断的 - IEnumerable<T>使用了您提供的泛型类型参数,这在编译时是已知的.通常,在编译时指定有关泛型和类型参数的所有内容.如果存在任何类型的不匹配,编译器将抱怨并且您的代码将无法编译.
有些边缘情况需要明确指定类型,这些仅在极少数情况下使用重载方法,有时会出现多种类型参数组合.
Eri*_*ert 13
与Java相比,C#具有更多的编译时和运行时类型推断功能.如果此主题感兴趣,请参阅我关于此主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/tags/type+inference/
如果您对泛型方法类型推断特别感兴趣,并且您有半小时的空闲时间,请在此解释我们如何更改C#3中的类型推断算法:
http://blogs.msdn.com/b/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx
Ree*_*sey 11
C#编译器通常可以在编译时推断泛型类型.当它可以执行此操作时,您不需要指定泛型方法的类型.
这是使LINQ"可用"的主要部分.如果没有编译时类型推断,查询将如下所示:
IEnumerable<int> myIds = myCollection
.Where<MyType>(i => i.Name == "Foo")
.Select<MyType, int>(i => i.Id);
Run Code Online (Sandbox Code Playgroud)
而不是写:
var myIds = myCollection.Where(i => i.Name == "Foo").Select(i => i.Id);
Run Code Online (Sandbox Code Playgroud)