![](/img/trans.png)
[英]Weird compilation error when indirectly refer to an assembly that declares a generic extension method with type restriction
[英]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.