public interface ISomeDTOInterface
{
...
}
public class SomeDTOClass : ISomeDTOInterface
{
...
}
public interface DataStoreChanges<T>
{
IEnumerable<T> data {get;}
IEnumerable<Guid> removedItems {get;}
IEnumerable<Guid> newItems {get;}
IEnumerable<Guid> modifiedItems {get;}
}
现在我有一个期望
的方法DataStoreChanges<ISomeDTOInterface>
,所以我尝试传递一个实例
DataStoreChanges<SomeDTOClass>
,
这会产生类型错误。它不会让我垂头丧气到界面:)
所以这里有什么不对。
答案 0 :(得分:5)
在C#4中,您可以使界面协变。为此,请将接口声明更改为:
public interface DataStoreChanges<out T>
否则,您可以使方法通用并添加相关的类型约束。
void SomeMethod<T> (DataStoreChanges<T> x) where T : ICommonInterface
{
...
}
答案 1 :(得分:1)
你遇到了问题,因为默认情况下你没有指定方法应该允许更多派生类型的T,在这个意义上它不是协变的。通过将您的界面定义更改为:
public interface DataStoreChanges<out T>
这将允许协方差。
如果无法做到这一点,我猜你也可以在where T : ICommonInterface
答案 2 :(得分:0)
我认为你缺少类型约束 - 但你真的可以添加非编译代码吗?
where T:ICommonInterface
但根据您的其他信息,这只是一个有根据的猜测。