簡體   English   中英

覆蓋泛型類型方法時的編譯錯誤

[英]Compilation error when overriding a generic type method

我在程序集A中公開以下類:

public abstract class ServiceDependencyHost
{
    protected virtual T ReferenceService<T>() where T : ServiceBase
    {
        // Virtual implementation here...
    }
}

我在一個單獨的程序集中公開了這個派生類(B):

public sealed class ProcessServiceOperation : ServiceDependencyHost
{
    public override T ReferenceService<T>()
    {
        // Override implementation here...

        return base.ReferenceService<T>();
    }
}

使用上面顯示的代碼,編譯器在這一行上抱怨:

return base.ReferenceService<T>();

類型'T'不能在泛型類型或方法A.ReferenceService()中用作類型參數'T'。 沒有從'T'到'System.ServiceProcess.ServiceBase'的裝箱轉換或類型參數轉換。

當然,我嘗試復制程序集B中的約束:

public override T ReferenceService<T>() where T : ServiceBase

但編譯器現在在上面的行上發出警告......

覆蓋和顯式接口實現方法的約束是從base方法繼承的,因此不能直接指定它們。

這個答案表明我的解決方案應該有效。 我想避免使用反射公開公開此方法。 應該這么簡單!

提前感謝任何能夠發現我犯的錯誤的人。

錯誤消息似乎具有誤導性。

請注意,您使用公共覆蓋覆蓋受保護的虛擬方法。 那不行。 使覆蓋也受到保護,代碼應該編譯得很好......

(我不確定看似錯誤的錯誤消息是否是一個小問題,或者編譯器的這種特殊行為背后是否有合理的解釋。)

問題並非嚴格歸因於仿制葯。 問題的原因是基類方法protected ,而派生類方法是public

覆蓋聲明不能更改虛擬方法的可訪問性。 覆蓋方法和虛方法都必須具有相同的訪問級別修飾符。

因此,編譯器假定這兩個方法是不同的,並且派生方法無法從基本方法繼承where T : ServiceBase泛型約束。 由於派生方法對T一無所知,因此當您嘗試將T傳遞給基本方法時,它會抱怨T無法轉換為ServiceBase

它因為公共=>受保護。 編譯好了

public abstract class ServiceDependencyHost
        {
            protected virtual T ReferenceService<T>() where T : new()
            {
                return new T();
            }
        }

        public sealed class ProcessServiceOperation : ServiceDependencyHost
        {
            protected override T ReferenceService<T>()
            {
                // Override implementation here...

                return base.ReferenceService<T>();
            }
        }

暫無
暫無

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

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