构造函数中泛型类型的操作会给出编译错误

本文关键字:编译 错误 操作 泛型类型 构造函数 | 更新日期: 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可以是intstring

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

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);