gpt4 book ai didi

c# - 返回通用接口(interface)时出错

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:07 26 4
gpt4 key购买 nike

下面的代码是我正在编写的程序的一个简单示例。

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

编译时出现如下错误

error CS0266: Cannot implicitly convert type 'ConsoleApplication3.Bbb' to 'ConsoleApplication3.IAaa'. An explicit conversion exists (are you missing a cast?)

error CS0266: Cannot implicitly convert type 'ConsoleApplication3.Ccc' to 'ConsoleApplication3.IAaa'. An explicit conversion exists (are you missing a cast?)

有什么办法可以让它发挥作用吗?

最佳答案

您不能按照您尝试的方式使用界面。查询covariance/contravariance ,你正在尝试做与可能的相反的事情(你在界面中可能是 <in T> 但你正试图像 <out T> 一样使用它)。

上课Bbb例如 - 它有一个 Execute(X)方法。如果你试图传递 Y 会发生什么? (这可能是也可能不是 X )?编译器不允许这样做,因为您从未在代码中定义在这种情况下应该发生什么。

你可以通过创建和实现另一个接口(interface)来做你想做的事,IAaa .例如

public interface IAaa
{
void Execute(Y ppp);
}

也许是这样实现的,这样如果你试图用一个无效的类型调用它,就会抛出一个转换异常:

void Main()
{
IAaa aa;
aa = Factory.Get(true);
}

public class Y
{ }

public class X : Y
{ }

public class W : Y
{ }

public interface IAaa<T> : IAaa
where T : Y
{
void Execute(T ppp);
}

public interface IAaa
{
void Execute(Y ppp);
}

public abstract class Aaa<T> : IAaa<T>
where T : Y
{
public abstract void Execute(T ppp);
void IAaa.Execute(Y ppp)
{
this.Execute(ppp);
}
protected abstract void Execute(Y ppp);
}

public class Bbb : Aaa<X>
{
public override void Execute(X ppp)
{ }
protected override void Execute(Y ppp)
{
this.Execute((X)ppp);
}
}

public class Ccc : Aaa<W>
{
public override void Execute(W ppp)
{ }
protected override void Execute(Y ppp)
{
this.Execute((W)ppp);
}
}

public class Factory
{
public static IAaa Get(bool b)
{
if(b)
return new Bbb();
else
return new Ccc();
}
}

关于c# - 返回通用接口(interface)时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947763/

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