C#泛型-从泛型类调用泛型方法

C#泛型-从泛型类调用泛型方法,c#,generics,casting,explicit,C#,Generics,Casting,Explicit,我有以下类,我试图从ExportFileBaseBL类调用Compare方法,但我得到了错误 无法将类型“Class1”隐式转换为“T”。存在显式转换(是否缺少强制转换?) 公共抽象类Class1,其中T:Class2 { 公开摘要类别1比较(类别1其他OBJ); } 公共抽象类Class3,其中T:Class1 你在哪里:2班 { 公共T比较(T obj1,T obj2) { 如果(obj1.Prop1>obj2.Prop1) { 返回obj1.Compare(obj2);//此处出现编译器错

我有以下类,我试图从ExportFileBaseBL类调用Compare方法,但我得到了错误

无法将类型“Class1”隐式转换为“T”。存在显式转换(是否缺少强制转换?)

公共抽象类Class1,其中T:Class2
{
公开摘要类别1比较(类别1其他OBJ);
}
公共抽象类Class3,其中T:Class1
你在哪里:2班
{
公共T比较(T obj1,T obj2)
{
如果(obj1.Prop1>obj2.Prop1)
{
返回obj1.Compare(obj2);//此处出现编译器错误
}
其他的
{
返回obj2.Compare(obj1);//此处出现编译器错误
}
}
}

类型转换不应该是隐式的吗?我遗漏了什么吗?

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

  return obj1.Compare<T>(obj2); 
返回obj1.Compare(obj2);
您还需要将Compare方法的定义设置为泛型:

public abstract Class1<T> Compare<T>(Class1<T> otherObj); 
公开摘要Class1比较(Class1-otherObj);

问题在于,您的抽象
比较
方法被定义为接受
Class1
类型的参数,并返回
Class1
的实例,不是比
Class1
更具体的类型。但是这就是你的
Class3.Compare
方法试图做的:调用
T.Compare
并假设输出将是
T
,而实际上你只能确定它将是
Class1

为了提供一个更简单、更容易理解的示例,假设我有这样一个类:

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

class Int32Parser
{
    public int Parse(Parser parser, string text)
    {
        return parser.Parse(text);
    }
}
上面的代码做出了一个错误的假设,类似于您自己的假设:
parser.Parse
将返回一个
int
,仅仅因为
int
派生自
对象
(就像您的情况一样,
T
必须派生自
Class1
);实际上,您只能确定它将返回一个
对象

有两种方法可以解决这个问题:make
Class1。比较一种通用方法:

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

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

Compare方法不是泛型的,因此它不会接受当前形式的类型参数。但是@Kyle只说明了需要在父代码中修复它的位置。他还需要在第一类比较方法中添加一个
,然后应该将该方法添加到答案中。我再加上,常识,是的。不过,直言不讳也无妨。:)@Kyle,这就是你在so上回答问题时发生的情况,你必须同时做白天的工作编码:)谢谢Dan,这回答了我的问题。Jup Jup,现在我们添加了一个关于比较方法键入的更新,我同意答案。
public abstract U Compare<U>(U otherObj) where U : Class1<T>;
public Class1<U> Compare(T obj1, T obj2)
{
    // ...
}