构造函数中泛型类型的操作会给出编译错误
本文关键字:编译 错误 操作 泛型类型 构造函数 | 更新日期: 2023-09-27 18:31:21
为什么 Funky<T>
中的构造函数重载对 action 参数有问题,而子类FunkyAction
没有?
class Funky<T>
{
readonly T _data;
public Funky(T data)
{
_data = data;
}
public Funky(Action action, bool imJustAnOverload)
: this(action) // cannot convert from 'System.Action' to 'T'
{
}
}
class FunkyAction : Funky<Action>
{
public FunkyAction(Action action)
: base(action) // no compile error
{
}
}
此构造函数:
public Funky(Action action, bool imJustAnOverload)
: this(action)
正在尝试使用此构造函数:
public Funky(T data)
将Action
作为参数传递给类型 T
的参数。
由于T
是泛型类型参数表,因此编译器无法保证action
可以转换为T
。就编译器而言,T
可以是int
或string
。
现在,对于派生类,此构造函数:
public FunkyAction(Action action)
: base(action)
正在尝试使用此基类构造函数:
public Funky(T action)
但是由于它将T
定义为Action
(在 class FunkyAction : Funky<Action>
中),那么基构造函数实际上看起来像这样(从FunkyAction
的角度来看):
public Funky(Action action)
现在,将类型 Action
的参数传递给需要Action
的方法没有问题。
您可以像这样使基类构造函数泛型:
public Funky(T action, bool imJustAnOverload)
: this(action)
{
}
这将允许您创建一个Funky<Action>
并使用如下所示的Action
构造它:
Funky<Action> funky = new Funky<Action>(() => DoSomething(), true);