C#泛型-从泛型类调用泛型方法
我有以下类,我试图从ExportFileBaseBL类调用Compare方法,但我得到了错误 无法将类型“Class1”隐式转换为“T”。存在显式转换(是否缺少强制转换?)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);//此处出现编译器错
公共抽象类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
);实际上,您只能确定它将返回一个对象
有两种方法可以解决这个问题:makeClass1。比较一种通用方法:
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)
{
// ...
}