【发布时间】:2018-01-29 23:45:14
【问题描述】:
我之前问过一个关于using generic vs base class in a method taking in a List<T> 的问题。很快就有人指出,您不能将 List<Derived> 传递给需要 List<Base> 的方法。
进一步探索(以及有用的链接,例如 this one)表明,虽然您不能将 List<Derived> 传递给 List<Base>,但您可以将 List<Derived> 传递给 IEnumerable<Base>(由于 .NET 4 中的逆变/协方差。
就像我之前的问题一样,我在这里提出相同的问题:既然使用这两个选项似乎没有区别,那么哪个更好?它是严格地基于样式的东西,还是使用一个而不是另一个有影响?
选项 A:void DoWork<TBase>(IEnumerable<TBase> objs) where TBase : Base;
选项 B:void DoWork(IEnumerable<Base> objs);
【问题讨论】:
-
选项 A 可以在方法中写入类似
new TBase()的内容......这只是一个立即浮现在脑海中的优势。 -
@HimBromBeere 您也可以将不同的类型添加到第一个集合中,使用
Base作为TBase。 -
确实,与使用
List<T>不同,使用IEnumerable<T>将允许您将任何实现IEnumerable<X>的实例发送到此方法,其中X派生(或实现)T。所以对于什么更好的问题 - 好吧,在这种情况下,我认为这两种实现之间没有太大区别。 Generic 可能会生成更多编译代码,但我认为这并不重要。 -
@ViRuSTriNiTy 不,它不会 - 试试看。你会得到一个错误:
Cannot create an instance of the variable type 'TBase' because it does not have the new() constraint。如果您将声明更改为where TBase : Base, new(),您可以使用new- 当然,您只能将它用于具有默认构造函数的类型。 -
@MatthewWatson 这是对的,只是忘了提。