簡體   English   中英

無法在通用父基類的接口的顯式實現內將子類強制轉換為另一個子類

[英]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的顯式實現時拋出該異常。 為什么會這樣,即使從一個顯式類型轉換BA正在上實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM