我注意到一段时间后使用泛型,这与之间没有太大区别:
public void DoSomething<T>(T t) where T : BaseClass{ }
还有这个:
public void DoSomething(BaseClass t){ }
到目前为止我唯一看到的区别是第一种方法可以添加其他约束,比如接口或new(),但如果你按照我编写它的方式使用它,我看不出太多区别.任何人都可以指出选择一个或另一个的重要因素吗?
解决方法
我认为最明显的区别是方法内部的参数类型会有所不同 – 在通用情况下实际类型,非泛型 – 总是BaseClass.
class Cat : Animal {} void DoSomething<T>(T animal) where T:Animal { IEnumerable<T> repeatGeneric = Enumerable.Repeat(animal,3); var repeatGenericVar = Enumerable.Repeat(animal,3); } void DoSomething(Animal animal) { IEnumerable<Animal> repeat = Enumerable.Repeat(animal,3); var repeatVar = Enumerable.Repeat(animal,3); }
现在如果你用新的Cat()调用它们:
> repeatGeneric和repeatGenericVar的类型将是IEnumerable< Cat> (注意var静态查找类型,显示突出显示事实类型是静态已知的)> repeat和repeatVar的类型将是IEnumrable< Animal>尽管Cat被传入了.