创建泛型类型实例的方法
本文关键字:方法 实例 泛型类型 创建 | 更新日期: 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">