为什么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
{
}
}
答案 0 :(得分:1)
这个构造函数:
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);