当前位置: 首页 > 编程语言 > C#

没有指定类型共享的C#通用方法

时间:2023-04-11 00:39:48 C#

C#没有指定类型的通用方法并编译,但这违背了我所知道的关于泛型应该如何工作的一切,所以我希望有人能向我解释这一点:所以我有一个这样定义的泛型方法:publicstaticListCopyAsList(IEnumerablelist,ObjectlockObject){if(list!=null){lock(lockObject){returnnewList(list);}}返回空值;但令我感到奇怪的是,我可以在不指定T的情况下调用这个通用方法并且它有效:Liststrings=newList(){"a","b","c"};Listints=newList(){1,2,3};对象锁定对象=新对象();foreach(CopyAsList(strings,lockObject)中的字符串s){Console.WriteLine(s);}foreach(intiinCopyAsList(ints,lockObject)){Console.WriteLine(i);}如何指定泛型的类型编译代码?C#是否在运行时推断类型?不,它是在编译时推断出来的——使用您提供的IEnumerable的泛型类型参数,这在编译时是已知的。通常,与泛型和类型参数有关的所有事情都是在编译时指定的。如果存在任何类型的不匹配,编译器将报错并且您的代码将无法编译。有一些边缘情况需要显式指定类型,这些仅在使用重载方法的极少数情况下使用,有时使用多个类型参数组合。C#比Java具有更多的编译时和运行时类型推断。如果对这个主题感兴趣,请参阅我关于这个主题的文章: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.aspxC#编译器通常可以在编译时推断泛型类型。当它可以这样做时,您不需要指定泛型方法的类型。这是使LINQ“可用”的主要部分。如果没有编译时类型推断,查询将如下所示:IEnumerablemyIds=myCollection.Where(i=>i.Name=="Foo").Select(i=>i.Id);而不是写:以上就是C#学习教程:C#通用方法分享的所有内容,不带指定类型。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varmyIds=myCollection.Where(i=>i.Name=="Foo").Select(i=>i.Id);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: