C# 构造函数中作为泛型类型的操作产生编译错误

C# 构造函数中作为泛型类型的操作产生编译错误,c#,.net,generics,delegates,C#,.net,Generics,Delegates,为什么Funky中的构造函数重载与action参数有问题,而子类FunkyAction没有问题 class Funky<T> { readonly T _data; public Funky(T data) { _data = data; } public Funky(Action action, bool imJustAnOverload) : this(action) // cannot convert

为什么
Funky
中的构造函数重载与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
    {
    }
}
class-Funky
{
只读T_数据;
公共Funky(T数据)
{
_数据=数据;
}
公共Funky(动作动作,bool imJustAnOverload)
:this(action)//无法从“System.action”转换为“T”
{
}
}   
类Funky动作:Funky
{
公共FunkyAction(行动)
:base(action)//无编译错误
{
}
}
此构造函数:

public Funky(Action action, bool imJustAnOverload)
    : this(action)
public Funky(T data)
public FunkyAction(Action action)
    : base(action)
 public Funky(T action)
正在尝试使用此构造函数:

public Funky(Action action, bool imJustAnOverload)
    : this(action)
public Funky(T data)
public FunkyAction(Action action)
    : base(action)
 public Funky(T action)
操作作为参数传递给
T
类型的参数

由于
T
是泛型类型参数,因此编译器无法保证
action
可以强制转换为
T
。就编译器而言,
T
可以是
int
string

现在,对于派生类,此构造函数:

public Funky(Action action, bool imJustAnOverload)
    : this(action)
public Funky(T data)
public FunkyAction(Action action)
    : base(action)
 public Funky(T action)
正在尝试使用此基类构造函数:

public Funky(Action action, bool imJustAnOverload)
    : this(action)
public Funky(T data)
public FunkyAction(Action action)
    : base(action)
 public Funky(T action)
但是由于它将
T
定义为
Action
(在
类FunkyAction:Funky
中),那么基本构造函数实际上是这样的(从
FunkyAction
的角度来看):

现在,将类型为
Action
的参数传递给需要
Action
的方法没有问题

可以将基类构造函数设置为通用的,如下所示:

public Funky(T action, bool imJustAnOverload)
        : this(action)
    {
    }
Funky<Action> funky = new Funky<Action>(() => DoSomething(), true);
这将允许您创建一个
Funky
,并使用
操作构建它,如下所示:

public Funky(T action, bool imJustAnOverload)
        : this(action)
    {
    }
Funky<Action> funky = new Funky<Action>(() => DoSomething(), true);
Funky-Funky=new-Funky(()=>DoSomething(),true);

因为
操作
!=<在基类中的code>T
T
可以是任何东西。在派生类中,
T
是一个
Action
。好的,是的-约束解释很有用。我以前使用C++(几年前!),我想,我暂时混淆了这两种语言。“MungBry,请注意,不能指定一个约束,用于<代码> t>代码>是<代码>动作< /代码>。我修改了答案。