簡體   English   中英

通用類型的接口實現失敗,因為“沒有匹配的返回類型”錯誤

[英]Interface implementation fails for generic type, because of “does not have the matching return type” error

我有一堂課:

 public abstract class Structure<T, S> : IStructure
    where T : StructureModel<S>, new()
    where S : StructureStats, new()
{
    protected T _model;

    public S Stats { get { return _model.Stats; } set { _model.Stats = value; } }

}

和一個接口:

public interface IStructure
{
    StructureStats Stats{ get; set;}
}

代碼無法編譯,並顯示以下消息

錯誤28'Server.Models.Structures.Structure'未實現接口成員'Server.Models.Structures.IStructure.Stats'。 “ Server.Models.Structures.StructureStats”無法實現“ Server.Models.Structures.IStructure.Stats”,因為它沒有匹配的“ Server.Models.Structures.StructureStats”返回類型。 C:\\ SRDevGit \\ freecon星系服務器\\ SRServer \\ Server.Models \\結構\\ Structure.cs

我不確定是什么問題; 應該保證Structure.Stats {get;}的返回類型與接口定義匹配,因為通用類型S被定義為通過以下方式從StructureStats派生

where S:StructureStats, new()

我想念什么? 如果可能的話,我想避免使IStructure通用,因為它會使

<IStructure<GenericType>>

因為GenericType是一個多態類。

C# 是強類型的,並且不支持協變返回類型,因此要從IStructure繼承,Structure必須返回確切的簽名StructureStats Stats{ get; set;} StructureStats Stats{ get; set;} 類似於StructureStatsDerived Stats{ get; set;} StructureStatsDerived Stats{ get; set;}不是完全匹配項,編譯器會拒絕它。

看起來您實際上並不需要通用參數S。您可以刪除S並僅返回StructureStats。

沒有使用通用接口就無法實現它,您還需要在通用約束中切換Structure<T, S>的順序

public class Structure< T, S> : IStructure<S>
where S : StructureStats, new()
where T : StructureModel<S>, new()
{
    protected T _model;

    public S Stats { get { return _model.Stats; } set { _model.Stats = value; } }

}

public interface IStructure<S> where S : StructureStats
{
    S Stats { get; set; }
}

暫無
暫無

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

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