当类型相同时,C#不能隐式转换类型

时间:2014-11-22 17:43:47

标签: c#-4.0 generics

我有一个通用类:

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>);
   }
}

我使用定义为:

的类Movement进行了以下类的类实例化
class Movement : ModelObject.

public partial class Movements : ModelSet<Movement>

由于

,以下代码无法编译
  

无法将ModelSet<Movement>类型隐式转换为Movements。存在显式转换。

Movements X = Movements.Lookup(12345);

当然,他们是一样的。我做错了什么?

1 个答案:

答案 0 :(得分: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);