创建泛型类型实例的方法

本文关键字:方法 实例 泛型类型 创建 | 更新日期: 2023-09-27 18:28:06

我正在尝试创建一个泛型方法。我希望调用方能够定义两种不同的类型。

private TableRow AddRowHelper<TROW, TCELL>(params string[] content) where TROW : TableRow where TCELL : TableCell
{
    TableRow row = new TROW();
    foreach (var text in content)
    {
        TableCell cell = new TCELL();
        cell.Text = text;
        row.Cells.Add(cell);
    }
    productsTable.Rows.Add(row);
    return row;
}

上面的代码给了我一个错误。

错误 4 无法创建变量类型"TROW"的实例,因为它没有 new(( 约束">

是否可以同时指定new约束和基本类型约束?当我指定类型必须派生自 TableRow 时,为什么我需要一个新的约束,它总是有一个new运算符。

创建泛型类型实例的方法

当我指定类型必须派生自 TableRow 时,为什么我需要一个新的约束,而 TableRow 总是有一个新运算符。

好吧TROW可能是一个继承自TableRow并且没有默认公共构造函数的类型。这就是您需要添加new()约束的原因。

派生类可以隐藏默认的无参数构造函数。 因此,不能从基类继承new()约束。

样本:

public class TableRow
{ } // implements a default, parameterless constructor
public class DeivedRow : TableRow
{
    public DerivedRow(string s)
    { } // no parameterless constructor
}

可以同时指定新约束和基本类型约束。这样做会使您的方法签名如下所示

public TableRow AddRowHelper<TROW, TCELL>(params string[] content) 
       where TROW : TableRow, new() where TCELL : TableCell, new()
{

每次基于泛型类型实例化时,都必须使用 new 约束将泛型类型限制为具有公共无参数构造函数的泛型类型。此外,方法在创建变量类型的实例时不能提供参数。

即使你指定类型必须派生自 TableRow(它总是有一个 new 运算符(,你也需要一个new约束,因为派生类型可能没有公共无参数构造函数,这就是将被调用的构造函数。

考虑一下:

public class A : TableRow
{
    private A(){}
}

并考虑使用它

AddRowHelper<A,TableCell>(args);

这将导致编译错误,

">

A"必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法"AddRowHelper(params string[]("中的参数"TROW">