C# 使用派生接口中的列表重写IReadOnlyList

C# 使用派生接口中的列表重写IReadOnlyList,c#,interface,architecture,polymorphism,C#,Interface,Architecture,Polymorphism,下面是一段我一直在努力工作的代码: public interface IReadOnlyGameState { IReadOnlyList<PlayerModel> Players { get; } } public interface IGameState : IReadOnlyGameState { new List<PlayerModel> Players { get; set; } } public class GameState : IGam

下面是一段我一直在努力工作的代码:

public interface IReadOnlyGameState
{
    IReadOnlyList<PlayerModel> Players { get; }
}

public interface IGameState : IReadOnlyGameState
{
    new List<PlayerModel> Players { get; set; }
}

public class GameState : IGameState
{
    public List<PlayerModel> Players { get; set; }
}
公共接口IReadOnlyGameState
{
IReadOnlyList玩家{get;}
}
公共接口IGameState:IReadOnlyGameState
{
新列表玩家{get;set;}
}
公共类游戏状态:IGameState
{
公共列表玩家{get;set;}
}

可以想象,这不起作用,因为只读接口中的IReadOnlyList和常规接口中的列表之间存在类型不匹配。如何为集合属性创建只读接口?

您的类必须实现这两个属性

您可以显式地实现接口,这样就不会直接从类本身访问它

public class GameState : IGameState
{
    public List<PlayerModel> Players { get; set; }

    IReadOnlyList<PlayerModel> IReadOnlyGameState.Players => Players.AsReadOnly();
}
公共类游戏状态:IGameState
{
公共列表玩家{get;set;}
IReadOnlyList IReadOnlyGameState.Players=>Players.AsReadOnly();
}

您的类必须实现这两个属性

您可以显式地实现接口,这样就不会直接从类本身访问它

public class GameState : IGameState
{
    public List<PlayerModel> Players { get; set; }

    IReadOnlyList<PlayerModel> IReadOnlyGameState.Players => Players.AsReadOnly();
}
公共类游戏状态:IGameState
{
公共列表玩家{get;set;}
IReadOnlyList IReadOnlyGameState.Players=>Players.AsReadOnly();
}

是的,我想知道是否有办法用一个实现勾选所有框。看起来没有其他方法了。如果你真的不需要只读接口,就不要使用它。这是许多程序员面临的问题。他们想模仿.Net类型,如List和IReadOnlyList。它对于.Net类型是必需的,因为它是通用的,并且是一个库。但是你的类型很可能只是在你自己的游戏中使用的,这对我的用例来说非常重要。我的游戏客户端将使用只读接口,而服务器将使用常规接口。我想我会坚持你的解决方案。谢谢你的帮助。@user1255410很高兴它有帮助。请注意,客户端可以轻松地将
玩家
从只读列表转换为常规列表并修改集合!如果要阻止此操作,请返回此值
IReadOnlyGameState.Players=>Players.AsReadOnly()我修正了我的答案。是的,我想知道是否有办法用一个实现勾选所有框。看起来没有其他方法了。如果你真的不需要只读接口,就不要使用它。这是许多程序员面临的问题。他们想模仿.Net类型,如List和IReadOnlyList。它对于.Net类型是必需的,因为它是通用的,并且是一个库。但是你的类型很可能只是在你自己的游戏中使用的,这对我的用例来说非常重要。我的游戏客户端将使用只读接口,而服务器将使用常规接口。我想我会坚持你的解决方案。谢谢你的帮助。@user1255410很高兴它有帮助。请注意,客户端可以轻松地将
玩家
从只读列表转换为常规列表并修改集合!如果要阻止此操作,请返回此值
IReadOnlyGameState.Players=>Players.AsReadOnly()我修正了我的答案。