作为构造函数中的泛型类型的Action会产生编译错误

时间:2016-01-21 11:23:34

标签: c# .net generics delegates

为什么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
    {
    }
}

1 个答案:

答案 0 :(得分:1)

这个构造函数:

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