“A类:B <c>”和“A类<t>之间有什么区别:B <t>其中T:C”?</t> </t> </c>

时间:2013-10-04 14:00:49

标签: c# generics

我正在尝试从泛型类创建派生类,我想知道它们之间的区别是什么

public class A<T> : B<T> where T : C
{
}

public class A: B<C>
{
}

在A类中,可能没有代码,因为(现在)它的行为与B类不同。我只想区分这两个类。

提前致谢。

5 个答案:

答案 0 :(得分:8)

说你有一个班级

public class D : C
{
}

然后在您的第一个示例中,以下内容有效。

var a = new A<D>

您可以使用最终从C。

派生的T的任何类

虽然您的第二个代码是硬编码的,但B使用C作为genric类型参数且不是通用的。

答案 1 :(得分:2)

样本为Constraints with generics in C#

public class A<T> : B<T> where T : C
{
}

通用T必须是C类型或其子类(什么是抽象)。

public class A: B<C>
{
}

通用名称为C

答案 2 :(得分:2)

在您的第一个示例中,A是类型C的通用类。它还继承自B类型的C类。

您的第二个示例具有以下属性:

A 不是通用类。它继承自B类型的C类。

所以,他们实际上是完全不同的。

答案 3 :(得分:1)

在第一个示例中,您将A Class 作为通用类,在实例化类时必须提供T

A<C> instance = new A<C>();

在第二个示例中,A Class 不是通用类,因为在实例化A Class时,无需声明T,因为它根据{{​​1}}声明在幕后自动完成。

A Class

另一个区别

如果您有给定的分层继承树:

enter image description here

在第一个示例中,当您实例化A instance = new A(); 类时,每个继承的类都可以用作A

在第二个示例中,您可以实例化T类并指定A类,因此只能从C2继承的类才能使用C2

答案 4 :(得分:0)

在第二个选项中,您最终会得到一个非泛型类A,而在第一个选项中,您将拥有泛型类A