【问题标题】:Difference between a base class and a contitioned generic基类和有条件的泛型之间的区别
【发布时间】:2014-01-30 08:03:41
【问题描述】:

使用泛型一段时间后,我注意到这之间并没有太大区别:

public void DoSomething<T>(T t) where T : BaseClass{

}

还有这个:

public void DoSomething(BaseClass t){

}

到目前为止,我看到的唯一区别是第一种方法可以添加其他约束,例如接口或new (),但是如果您按照我编写的方式使用它,我看不出有什么不同。任何人都可以指出选择一个或另一个的任何重要因素吗?

【问题讨论】:

    标签: c# generics polymorphism


    【解决方案1】:

    我认为最明显的区别是方法内部参数的类型会有所不同 - 在通用情况下实际类型,非通用 - 总是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);
     } 
    

    现在,如果您同时使用new Cat() 拨打电话:

    • repeatGenericrepeatGenericVar 的类型都将是IEnumerable&lt;Cat&gt;(注意var 静态查找类型,显示以突出​​显示静态已知类型)
    • repeatrepeatVar 的类型都将是 IEnumrable&lt;Animal&gt;,尽管传入了 Cat

    【讨论】:

    • 对于您的回答,我认为使用通用版本通常是一个更好的主意,因此您可以保留有关类型的更多信息。
    • @Gerard - 我不会说一个更好 - 它们用于不同的目的并且有不同的缺点。 IE。泛型和继承通常会引起混淆:class My&lt;T&gt;{} 后面的类型 My&lt;int&gt;My&lt;string&gt; 在某种程度上感觉相关,但它们只是两种不同的类型;由于开放性,对泛型方法的正确测试需要更多案例:void Do(int) 需要测试一些 int 值,但 Void Do&lt;T&gt;(T) 需要测试一些值类型、引用类型;有时很难混合泛型和非泛型代码,尤其是当泛型需要真实类型时...
    猜你喜欢
    • 2019-07-14
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2012-12-09
    • 2020-04-14
    相关资源
    最近更新 更多