无法在泛型父基类中的接口显式实现中将子类显式强制转换为另一个子类



我有以下代码:

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

当我运行它时,当AbstractBaseClass<T>执行DoStuff的显式实现时,我抛出了一个InvalidCastException: 'Unable to cast object of type 'B' to type 'A'.' 。为什么即使在B上实现了从BA的显式强制转换?

非常有趣的是,如果我替换

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 分配给具体类的界面

public class A : AbstractBaseClass<IInterface>

我认为如果这对您有帮助,这里的抽象类是无用的,您应该直接实现接口。

我需要知道更多,以及该设计的目的是什么?因为如果我们知道您要实现的目标,就会有很多解决方案。

最新更新