C#generics-没有设计的下界?我正在阅读CodehuaatWork中对JoshuaBloch的采访,他对在Java5中引入泛型表示遗憾。他不喜欢具体的实现,主要是因为变体支持-Java的通配符-使它变得不必要的复杂。据我所知,C#3没有明确的、有界的通配符,例如您不能声明采用资产或任何资产子类的PriceBatch方法voidPriceBatch(Collectionassets)(Java中的voidPriceBatch(Collectionassets)?)。有谁知道为什么C#中没有添加通配符和边界?这些特性是为了简化语言而故意遗漏的,还是它们还没有实现?编辑:HolySmoke,EricLippert本人发表评论!在阅读了他和Paul的伟大见解后,我意识到至少支持上限,并且可以将上面的示例转换为C#:voidPriceBatch(ICollectionassets)whereT:Asset另一方面,显然不支持下限,正如埃里克在他的第二条评论中所说,例如,可能没有办法直接将这个(有点人为的)Java代码转换为C#:staticvoidcopyAssets(Collectionsrc,Collectiondst){for(Tasset:src)dst.add(asset);}集合src=newArrayList();[...]集合dst=newArrayList();[...]copyAssets(src,dst);我对吗?如果是这样,那么C#有上限而不是下限的特殊原因是什么?一个复杂的问题。首先让我们考虑一下您的基本问题,“为什么这在C#中是非法的?”classCwhereT:Mammal{}//合法classDwhereGiraffe:T{}//非法也就是说,泛型类型约束可以说“T必须是可以分配给Mammal类型变量的任何引用类型”,但不是“T必须是任何引用类型,其变量可以分配给Giraffe”。为什么不同?我不知道。那是在我加入C#团队之前很久。简单的答案是“因为CLR不支持它”,但是设计C#泛型的团队与设计CLR泛型的团队是同一个团队,所以这并不是真正的解释。我的猜测是一如既往地支持必须设计、实施、测试、记录并交付给客户的功能;没有人为该功能做任何这些事情,所以它不在语言中。我没有看到提议的功能有什么巨大的、令人信服的好处;没有引人注目的好处的复杂功能往往会在这里被削减。然而,这是猜测。下次我碰巧和从事泛型研究的人聊天时——不幸的是,他们住在英国,不管他们是否在我的大厅里,不幸的是——我会问。至于你的具体例子,我认为保罗是对的。您不需要下限约束即可使其在C#中工作。你可以说:voidCopy(Collectionsrc,Collectiondst)whereT:U{foreach(Titeminsrc)dst.Add(item);也就是说,将约束放在T上,而不是U上。C#4引入了允许泛型中的协变和逆变的新功能。还有另一个SO帖子更详细地讨论了这个问题:HowtoimplementgenericcovarianceandinversevarianceinC#4.0?新功能不会在所有类型中自动启用此功能,但有一种新语法允许开发人员指定泛型参数是协变的还是逆变的。C#4之前的C#版本具有与此类似的功能,因为它与委托和某些数组类型相关。关于委托,原始参数类型的委托是允许的。关于数组类型,我认为它可以工作,除非涉及装箱。也就是说,Customer数组可以是一个对象数组。但是,无法将整数数组转换为对象数组。.net已经有了通配符的等价物,更符合逻辑地命名泛型类型约束,你可以毫无问题地做你描述的事情列表b=新列表();清单c=新清单();测试(一);测试(二);测试(c);}staticvoidtest(Lista)whereT:a{return;}}classa{}classb:a{}classc:b{}}示例2namespaceConsoleApplication3{classProgram{staticvoidMain(string[]args){ICollectionsrc=newList();ICollectiondst=newList();copyAssets(src,dst);}publicstaticvoidcopyAssets(ICollectionsrc,ICollectiondst)whereT:G{foreach(Tassetinsrc)dst.Add(asset);}}publicclassAsset{}publicclassDerivative:Asset{}publicclassVanillaOption:Derivative{}}这个例子代表了你的例子在java中的代码转换。虽然我真的不能回答实际问题!以上就是C#学习教程:C#泛型——设计无下限?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
