使用约束类型通用与使用基类型

时间:2018-01-29 13:16:42

标签: c# generics type-conversion

最近我们正在努力探讨以下哪项会更好。

我们的域有一个基类型,有很多继承自它的类:

public abstract class DomainBase
{
    public int BaseId { get; set; }
}

在代码中的另一个位置,我们有一个方法,它接受一组对象并基于BaseId工作。它不会返回对象,也不会使用给定的类型。

我的问题:在这里使用通用或者只是接受基类型会更好吗?

选项A:void DoWork<TDomainBase>(List<TDomainBase> objects) where TDomainBase : DomainBase;

选项B:void DoWork(List<DomainBase> objects);

在我们的代码中,这些被称为相同,因为我们从不使用具有不同类型的List<DomainBase>集合(例如new List<DomainBase> { new Foo(), new Bar() })。我想说使用泛型更好,因此我们在将objects传递给方法时不会隐式转换为它们的基类。但我想确保我不会错过这里明显的东西。 (或者,哎呀,无论我选择哪种选项,C#都可能只是优化所有这些!)很高兴被证明是错误的。

编辑删除不正确的陈述。

1 个答案:

答案 0 :(得分:2)

&#34;两种选择都应该有效&#34; - 那么,几乎正确。

使用通用选项,您只需传递基本类型或任何类型的列表 直接从它派生到该方法的类型:

void DoWork<TDomainBase>(List<TDomainBase> objects) where TDomainBase : DomainBase
...
...
var list = new List<SomeClassDerivedFromDomainBase>() {/* initialize items */};

DoWork(list);

但是,使用基类列表,您将需要执行一个额外步骤并从派生类型列表中生成该列表:

void DoWork(List<DomainBase> objects);

var list = new List<SomeClassDerivedFromDomainBase>() {/* initialize items */};

DoWork(list); // This will cause a compilation error:
// Cannot implicitly convert type 'System.Collections.Generic.List<SomeClassDerivedFromDomainBase>' to 'System.Collections.Generic.List<DomainBase>'

Why can't I assign a List<Derived> to a List<Base>?

的答案中解释了您将收到编译错误的原因

要解决这个问题,你必须做这样的事情:

DoWork(list.ToList<DomainBase>());

我认为现在应该很清楚,在这种情况下,通用选项更好。