【发布时间】:2013-04-03 14:06:39
【问题描述】:
以下代码是我正在编写的程序的一个简单示例。
public class Y
{ }
public class X : Y
{ }
public class W : Y
{ }
public interface IAaa<T>
where T : Y
{
void Execute(T ppp);
}
public abstract class Aaa<T> : IAaa<T>
where T : Y
{
public abstract void Execute(T ppp);
}
public class Bbb : Aaa<X>
{
public override void Execute(X ppp)
{ }
}
public class Ccc : Aaa<W>
{
public override void Execute(W ppp)
{ }
}
public class Factory
{
public static IAaa<Y> Get(bool b)
{
if(b)
return new Bbb();
else
return new Ccc();
}
}
class Program
{
static void Main(string[] args)
{
IAaa<Y> aa;
aa = Factory.Get(true);
}
}
当我编译它时,我得到以下错误
错误 CS0266:无法隐式转换类型“ConsoleApplication3.Bbb” 到“ConsoleApplication3.IAaa”。显式 存在转换(您是否缺少演员表?)
错误 CS0266:无法隐式转换类型“ConsoleApplication3.Ccc” 到“ConsoleApplication3.IAaa”。显式 存在转换(您是否缺少演员表?)
有没有办法让它工作?
【问题讨论】:
-
比起你的问题,我的建议是使用更有意义的类名
;) -
您遗漏了一些东西/过度简化了您的示例 -
Get方法在其定义和来自Main()的调用中都需要一个类型参数 -
我相信简单地询问新的 Bbb 或 Ccc 不会告诉基类 Aaa
中的类型参数是什么。
标签: c# generics inheritance