C#泛型 - 从一个普通类调用泛型方法

问题描述:

我有以下类和我试图调用从ExportFileBaseBL类比较方法,但我得到的错误C#泛型 - 从一个普通类调用泛型方法

不能键入“1类”隐式转换为“T” 。一个显式转换存在(是否缺少强制转换?)

public abstract class Class1<T> where T: Class2 
{ 
    public abstract Class1<T> Compare(Class1<T> otherObj); 
} 

public abstract class Class3<T, U> where T: Class1<U> 
         where U: Class2 
{ 
    public T Compare(T obj1, T obj2) 
    { 
     if (obj1.Prop1 > obj2.Prop1) 
     { 
      return obj1.Compare(obj2); // Compiler Error here 
     } 
     else 
     { 
      return obj2.Compare(obj1); // Compiler Error here 
     } 
    } 

} 

不应类型转换是隐式的?我错过了什么吗?

的问题是,你的抽象Compare方法定义为接受Class1<T>类型的参数和返回实例Class1<T>,不是更具体类型比Class1<T>。但这是您的Class3.Compare方法正在尝试执行的操作:请致电T.Compare并假定输出将为T,而实际上您只能确定它将是Class1<U>

提供一种更简单,更易于理解的例子,假设我有这个类:

class Parser 
{ 
    public abstract object Parse(string text); 
} 

class Int32Parser 
{ 
    public int Parse(Parser parser, string text) 
    { 
     return parser.Parse(text); 
    } 
} 

上面的代码让类似自己的一个错误的假设:parser.Parse将返回int只是因为intobject派生(就像你的情况一样,T必须来自Class1<U>);事实上,你只能确定它会返回一个object

有两种方法我可以看到解决这个问题:让Class1<T>.Compare泛型方法:

public abstract U Compare<U>(U otherObj) where U : Class1<T>; 

...或放松你的Class3.Compare方法的返回值的类型特异性:

public Class1<U> Compare(T obj1, T obj2) 
{ 
    // ... 
} 

就个人而言,除非你绝对需要第一个,我宁愿选择第二个。当复杂性开始像这样增长时,所有这些泛型约束都会变得非常混乱并且给您带来的负担超出您的预期。

使用您在类级声明的参数类型调用该方法。

return obj1.Compare<T>(obj2); 

你需要做的比较通用的方法,以及定义:

public abstract Class1<T> Compare<T>(Class1<T> otherObj); 
+1

比较方法不是通用的,所以它不会接受当前形式的类型参数。 – 2011-02-02 17:22:55

+0

但@Kyle只是说明了它需要在父代码中修复的地方。他还需要添加一个'`到第一类比较方法。 – jcolebrand 2011-02-02 17:28:39