泛型类和向下转换(类型转换)

时间:2011-01-03 16:23:32

标签: c# generics

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>, 这会产生类型错误。它不会让我垂头丧气到界面:) 所以这里有什么不对。

3 个答案:

答案 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

但根据您的其他信息,这只是一个有根据的猜测。