2014-11-22 121 views
0

我有一个泛型类:C#不能隐式转换类型时类型相同

public abstract class ModelSet<T> : ObservableCollection<T>, IModelObject where T : ModelObject, new(){ 

    public static ModelSet<T> Lookup(long pObjectId){ 
     return (ModelObjectMap.Get(pObjectId) as ModelSet<T>); 
    } 
} 

我一直在使用一个类运动类型的下面的类实例化定义为:

class Movement : ModelObject. 

public partial class Movements : ModelSet<Movement> 

的以下代码将无法编译,因为

不能将类型ModelSet<Movement>隐式转换为Movements。存在明确的转换。

Movements X = Movements.Lookup(12345); 

毫无疑问,它们是相同的。我究竟做错了什么?

回答

1

当然,它们是一样的。

不,它们不一样。一个是Movements,另一个是ModelSet<Movement>。虽然每个Movements实例是ModelSet<Movement>的一个实例,但它完全是可能有一个ModelSet<Movement>这不是Movements ...而您的方法的返回类型仅表示它将返回ModelSet<T>

我们不知道ModelObjectMap.Get(pObjectId)实际上做了什么,但它肯定会返回ModelSet<Movement>实例,它不是Movements

我们不知道你需要的返回值做什么,但你肯定可以这样写:

ModelSet<Movement> X = Movements.Lookup(12345); 

...虽然这是值得注意的是,Movements类实际上是不参与该打电话;它实际上会编译为:

ModelSet<Movement> X = ModelSet<Movement>.Lookup(12345);