[英]C# Generics - Calling generic method from a generic class
我有以下類,並且我試圖從ExportFileBaseBL類調用Compare方法,但是出現錯誤
無法將類型“ Class1”隱式轉換為“ 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
僅因為int
派生自object
(就像您的情況一樣, 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);
您還需要使Compare方法的定義通用:
public abstract Class1<T> Compare<T>(Class1<T> otherObj);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.