c# - 作为方法参数类型的接口(interface)有效但不是接口(interface)列表

标签 c# interface

我有一个接口(interface)和 2 个继承该接口(interface)的类,如下所示

public interface ILeader
{
    int ID { set; get; }
    string Name { set; get; }
}
public class User : ILeader
{
    public int ID { set; get; }
    public string Name { set; get; }
}
public class Group : ILeader
{
    public int ID { set; get; }
    public string Name { set; get; }
}

现在我有 2 个方法,其参数类型为 ILeader 和 ILeader 的 IList

public void Change(ILeader leader)
{
  //do some thing           
}
public void ChangeList(IList<ILeader> leaderList)
{
  //do some thing           
}

现在我可以将 GroupUser 的对象传递给 Change 方法并且它可以工作。但是当我尝试用 ListChangeList 方法做同样的事情时,它给我编译时错误。

IList<User> userList=new List<User>();
userList.Add(new User { ID=1, Name ="Happy"});

Change(userList[0]);  //this works

ChangeList(userList);  //this throws compile error

错误是

cannot convert from List<User> to List<ILeader>

如何使我的 ChangeList 方法起作用,以便我可以同时传递 UsersGroups 列表?

最佳答案

如果您使用的是 .Net 4.0 或更高版本,您可以将 IList(T) 更改为 IEnumerable(T),它将起作用。 IList(T) 接口(interface)的 T 参数不是协变的,而 IEnumerable(T) 接口(interface)的 T 参数是。见

http://msdn.microsoft.com/en-us/library/dd469487.aspx

进一步解释。

关于c# - 作为方法参数类型的接口(interface)有效但不是接口(interface)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201259/

相关文章:

c# - 如何对全局错误处理程序进行单元测试?

c# - 如何在 asp.net mvc 中使用 DataAnnotations 验证字符串长度?

c# - 是否可以在接口(interface)中包装 C# 单例?

interface - OCaml 接口(interface)与签名?

java - GWT 导入 com.google.gwt.user.cellview.client.CellBrowser 问题

具有纯虚运算符+函数的 C++ 抽象基类

c# - 报告处理期间发生错误。 -ASP.NET MVC 中的 RLDC 报告

c# - 漏洞? System.ArgumentException : 'unable to figure out route for:

java - 实现 JpaRepository 的最佳实践

c# - 将Excel公式转换为C#(年金)