gpt4 book ai didi

c# - 在构造函数中作为通用类型的操作会产生编译错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:55 24 4
gpt4 key购买 nike

为什么构造函数在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);

关于c# - 在构造函数中作为通用类型的操作会产生编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34922471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com