C# 相当于<;?扩展类型>;?

C# 相当于<;?扩展类型>;?,c#,generics,C#,Generics,我在C#工作。我在代码中创建了一个名为EntityInterface的接口。我写了这个函数: private void Save(List<EntityInterface> entities) { ... } private void Save(列出实体) { ... } 在代码的其他地方,我有一个变量定义为List。作业类是实现EntityInterface的类 我无法将作业对象列表传递给Save方法。编译器抱怨参数类型错误,因为List与List不同 我需要修改函数来表达这样

我在C#工作。我在代码中创建了一个名为EntityInterface的接口。我写了这个函数:

private void Save(List<EntityInterface> entities)
{ ... }
private void Save(列出实体)
{ ... }
在代码的其他地方,我有一个变量定义为
List
。作业类是实现EntityInterface的类

我无法将作业对象列表传递给Save方法。编译器抱怨参数类型错误,因为
List
List
不同


我需要修改函数来表达这样的想法,即参数可以是“实现EntityInterface的任何对象的列表”。我已经到处搜索过了,但找不到如何执行此操作的示例。

您的模型应该如下所示:

using System.Collections.Generic;

public interface IEntity
{
    void Save<T>(List<T> entities) where T : IEntity;
}

public class Job : IEntity
{
    void IEntity.Save<T>(List<T> entities) { }
}

public class TargetImpl : IEntity
{
    void IEntity.Save<T>(List<T> entities) { }
}
使用System.Collections.Generic;
公共界面的开放性
{
作废保存(列出实体),其中T:Entity;
}
公共课工作:专业
{
void IEntity.Save(列出实体){}
}
公共类TargetImpl:通用性
{
void IEntity.Save(列出实体){}
}
作为一项测试:

using System.Collections.Generic;
using Xunit;

public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        IEntity ientity = new TargetImpl();
        ientity.Save(new List<Job>());
    }
}
使用System.Collections.Generic;
使用Xunit;
公共类UnitTest1
{
[事实]
公共void Test1()
{
IEntity=新的TargetImpl();
保存(新列表());
}
}
一个警告是,上面的示例显式实现了IEntity接口(为简洁起见),因为这样的子实现必须通过该接口显式引用。对于类似但细微不同的实现,您还可以执行以下操作:

public class Job : IEntity
{
    public void Save<T>(List<T> entities) where T : IEntity { }
}

public class TargetImpl : IEntity
{
    public void Save<T>(List<T> entities) where T : IEntity { }
}
公共类作业:IEntity
{
public void Save(列出实体),其中T:IEntity{}
}
公共类TargetImpl:通用性
{
public void Save(列出实体),其中T:IEntity{}
}
测试impl可以(可选)更改为:

[Fact]
public void Test1()
{
    targetImpl ientity = new TargetImpl();
    ientity.Save(new List<Job>());
}
[事实]
公共void Test1()
{
targetImpl ientity=新的targetImpl();
保存(新列表());
}

您在找什么?或者?请粘贴您试图传递的内容的定义,以及您的方法的实际类型。不完全确定您要求的内容(如
Try
private void Save(列出实体)其中T:EntityInterface
。你说的是协方差,但我同意@Enigmativity赞赏注释和示例。解决方案非常简单。我将List更改为IEnumerable。我猜编译器意识到你不能通过IEnumerable将项添加到列表中,因此它允许以这种方式传递列表。