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>代码>是<代码>动作< /代码>。我修改了答案。