如何将两个类似的具体对象传递给一个具有接口参数的方法,该接口参数在C#中实现泛型?

如何将两个类似的具体对象传递给一个具有接口参数的方法,该接口参数在C#中实现泛型?,c#,generics,interface,C#,Generics,Interface,我有以下接口声明: interface IOrder<T> where T: IOrderItem { IList<T> Items { get; set; } } interface IDistro<T> : IOrder<T> where T: IOrderItem { } 错误是: UpdateDistro(IDistro)”的最佳重载方法匹配有一些无效参数 答案是相反的吗?我尝试将添加到原始接口声明中,但这增加了我无法解决的

我有以下接口声明:

interface IOrder<T> where T: IOrderItem
{
     IList<T> Items { get; set; }
}

interface IDistro<T> : IOrder<T> where T: IOrderItem
{

}
错误是:

UpdateDistro(IDistro)”的最佳重载方法匹配有一些无效参数

答案是相反的吗?我尝试将
添加到原始接口声明中,但这增加了我无法解决的更多错误。这是我第一次深入研究接口,我确信泛型正在增加复杂性,因此这里可能存在根本性的理解不足。

您是否尝试过:

public static void UpdateDistro<T>(IDistro<T> distro) 
  where T : IOrderItem
{  
} 

您可以在接口中定义协变通用参数,但需要稍微更改接口,以确保
T
不会反向使用:

public interface IOrder<out T> where T : IOrderItem
{
    IEnumerator<T> Items { get; }
}

public interface IDistro<out T> : IOrder<T> where T : IOrderItem
{

}
公共接口IOrder,其中T:IOrderItem
{
IEnumerator项{get;}
}
公共接口IDistro:IOrder,其中T:IOrderItem
{
}

T
定义为coverient参数(
out
),允许隐式转换实现变量接口的类。

是的,我尝试过。它在传递
发行版
对象时仍会抱怨
UpdateDistro(myDistro)
抛出了相同的错误。我看到这是一个错误。如果你能告诉我调用该方法的正确方法,我会将其标记为答案。谢谢。对不起,我很痛苦。我在其他测试中发现了一些遗留问题,我正在将其转换为接口类型,等等。这可以按预期工作。非常感谢@讽刺的是,没问题。我很高兴能帮上忙。
Distro d = new Distro();
UpdateDistro(d);
public static void UpdateDistro<T>(IDistro<T> distro) 
  where T : IOrderItem
{  
} 
Distro d = new Distro();
PerishableOrder p = new PerishableOrder();

UpdateDistro(d);
UpdateDistro(p);
public interface IOrder<out T> where T : IOrderItem
{
    IEnumerator<T> Items { get; }
}

public interface IDistro<out T> : IOrder<T> where T : IOrderItem
{

}