簡體   English   中英

C#泛型-從泛型類調用泛型方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM