“class A : B<C>” 和 “class A<T> : B<T> where T : C” 有什么区别?

8

我正在尝试从一个通用类中创建派生类,想知道以下两种方式之间的区别:

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

并且

public class A: B<C>
{
}

在A类中可能不会有任何代码,因为它现在的行为与B类没有区别。我只是想区分这两个类。

提前致谢。

5个回答

9

假设你有一个类

public class D : C
{
}

那么在你的第一个例子中,以下内容是有效的。
var a = new A<D>

您可以使用任何继承自C的类作为T

而您的第二段代码硬编码了B使用C作为通用类型参数,不是通用的。


2
在您的第一个示例中,A是一个类型为C的通用类。它还继承了类型为C的类B
您的第二个示例具有以下属性: A不是一个通用类。它继承了类型为C的类B
因此,它们实际上非常不同。

2
这是一个关于C#泛型约束的文章,例如:Constraints with generics in C#
在...
public class A<T> : B<T> where T : C
{
}

泛型的 T 必须是一个 C 类型或其子类(即抽象类型)。

public class A: B<C>
{
}

通用的是 C

1
在第一个示例中,您正在使 A Class 成为一个通用类,必须在实例化类时给定 T
A<C> instance = new A<C>();

在第二个示例中,A Class不是一个泛型类,因为在实例化A Class时无需声明T,因为它会根据A Class的声明自动完成。
A instance = new A();

另一个不同之处

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

enter image description here

在第一个示例中,当您实例化A类时,每个继承类都可以用作T

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接