[英]Unable to explicitly cast a child class to another child class inside explicit implementation of interface in generic parent base class
我有以下代码:
class Program
{
static void Main(string[] args)
{
var first = new A();
OtherClass.EnjoyLife(new OtherClass(first), OtherClass.Default);
Console.ReadKey();
}
public interface IInterface
{
void DoStuff(IInterface obj);
}
public abstract class AbstractBaseClass<T> : IInterface where T : AbstractBaseClass<T>
{
internal abstract void DoStuff(T obj);
void IInterface.DoStuff(IInterface obj) => DoStuff((T)obj);
}
public class A : AbstractBaseClass<A>
{
internal override void DoStuff(A obj)
{
Console.WriteLine($"Do {obj}");
}
}
public class B : AbstractBaseClass<B>
{
internal override void DoStuff(B obj)
{
Console.WriteLine($"Do {obj}");
}
public static explicit operator A(B obj) => new A();
}
public class OtherClass
{
public static readonly OtherClass Default = new OtherClass();
private IInterface foo;
private OtherClass()
{
this.foo = new B();
}
public OtherClass(IInterface bar)
{
this.foo = bar;
}
public static void EnjoyLife(OtherClass left, OtherClass right)
{
left.foo.DoStuff(right.foo);
}
}
}
运行它时,我有一个InvalidCastException: 'Unable to cast object of type 'B' to type 'A'.'
在AbstractBaseClass<T>
上执行DoStuff
的显式实现时抛出该异常。 为什么会这样,即使从一个显式类型转换B
到A
正在上实现B
?
有趣的是,如果我更换
void IInterface.DoStuff(IInterface obj) => DoStuff((T)obj);
通过
void IInterface.DoStuff(IInterface obj) => DoStuff((T)obj.GetType().GetMethod("op_Explicit").Invoke(null, new[] { obj }));
然后就可以正常工作了。 但是由于其他原因,我无法解决此问题。 我知道该代码已被规避,但我看不出任何理由不起作用。
基于Main方法和OtherClass中的内容,在覆盖DoStuff方法时,应该依赖于抽象而不是具体的类。例如
internal override void DoStuff(IInterface obj)
{
Console.WriteLine($"Do {obj}");
}
但是要做这样的事情,您应该删除抽象类上的约束
public abstract class AbstractBaseClass<T> : IInterface// where T : AbstractBaseClass<T>
并在具体类上将T分配给IInterface
public class A : AbstractBaseClass<IInterface>
我认为如果这样做对您没有帮助,那么您应该直接实现该接口。
我需要了解更多信息,该设计的目的是什么? 因为如果我们知道您要实现的目标,则有很多解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.