簡體   English   中英

將泛型轉換為抽象庫-協方差

[英]Casting Generic to abstract base - covariance

下面的代碼給出了編譯時錯誤:

錯誤170無法將類型“ Tests.ChangeListener”轉換為“ Tests.BaseListener”

我該如何進行編譯?

namespace Tests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void ShouldCompile()
        {
            BaseListener<IChange> listener = (BaseListener<IChange>)new ChangeListener();
        }
    }

    public interface IChange
    {
    }

    public interface ISpecificChange : IChange
    {   
    }

    public abstract class BaseListener<T> 
    where T : IChange
    {       
    }

    public class ChangeListener : BaseListener<ISpecificChange>
    {
    }
}   

由於您不能在抽象類上進行互變或協變(即inout ),因此您可能需要為偵聽器提供接口。 修改上面的內容使其看起來可以編譯(請注意,未提及的實體與原始代碼相同-剝離屬性以節省測試時需要導入引用的情況):

public class UnitTest1
{
    public void ShouldCompile()
    {
        IListener<IChange> listener = new ChangeListener();
    }
}


public interface IListener<out T> {}

public abstract class BaseListener<T> : IListener<T>
where T : IChange
{       
}

顯然,這是您目前沒有的步驟,由於某種原因可能無法使用,但這是使代碼編譯的最簡單方法,我認為您可以執行所需的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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