簡體   English   中英

返回泛型方法中的特定類型

[英]Return specific type in generic method

我寫了以下方法:

public T CreatePackage<T>() where T : new()
{
        var package = new T();

        if (typeof(ComponentInformationPackage) == typeof(T))
        {
            var compInfoPackage = package as ComponentInformationPackage;

            // ...

            return compInfoPackage;
        }

        throw new System.NotImplementedException();
}

我檢查T是什么類型,根據這個我對待我的變量 當我想要返回它時,我得到編譯器錯誤。

ComponentInformationPackage類型不能隱式轉換為T”

我怎么解決這個問題?

第一:如果演員不起作用,安全演員陣容確實有效:

return CompInfoPackage as T;

...如果T上有一個class約束:

public static T CreatePackage<T>() where T : class, new() { ... }

第二:鑒於此代碼:

var package = new T();
if (typeof(ComponentInformationPackage) == typeof(T))
{
    var compInfoPackage = package as ComponentInformationPackage;

    // ...

    return (T)compInfoPackage; 
}

...你已經擁有了新對象的參考package 由於它是T類型,編譯器已經將它視為返回類型。 為什么不回歸呢?

var package = new T();
if (typeof(ComponentInformationPackage) == typeof(T))
{
    var compInfoPackage = package as ComponentInformationPackage;

    // ...

    return package; // Same object as compInfoPackage
}

您必須轉換為T因為您的方法返回T的實例而不是ComponentInformationPackage

return (T)CompInfoPackage;

編譯器沒有機會知道T實際上是一個ComponentInformationPackage 但是,由於您已經在此演員表之前檢查了它,因

但是我不確定為什么你有一個泛型類型,因為只有ComponentInformationPackage實例由你的方法處理。 省略類型參數和約束,並簡單地返回您已經執行的操作。

編輯:我已經在評論中提到它,你也可以返回package (沒有任何演員),因為編譯器已經知道packageT一個實例。 你有的最后一個機會是return (T)(object) CompInfoPackage ,但這對我來說似乎很奇怪。

回歸到T將不會像HimBromBeere所建議的那樣起作用 ,因此不是你的解決方案。 為了讓編譯器接受轉換,您需要一個ComponentInformationPackage的附加類型約束。 所以這將是你的修復:

public T CreatePackage<T>()
    where T : ComponentInformationPackage, new()
{
        var package = new T();

        if (typeof(ComponentInformationPackage) == typeof(T))
        {
            var compInfoPackage = package as ComponentInformationPackage;

            // ...

            return (T)compInfoPackage;
        }

        throw new System.NotImplementedException();
}

另外,我建議使用大寫約定作為MSDN的指南。 這與你的問題無關,但這是一個提示。

如果你想根據類型處理對象創建,你不應該在這里使用泛型(因為它不是通用的)。 也許使用工廠模式來實現這一目標。

我認為除非你的所有類型都實現了通用接口或者是一些常見的抽象類型,否則你想要實現的內容是不可能的泛型

public T CreatePackage<T>()
    where T : IPackage, new()
{
        var package = new T();

        if (typeof(ComponentInformationPackage) == typeof(T))
        {
            var compInfoPackage = package as ComponentInformationPackage;

            // ...

            return (T)compInfoPackage;
        }

        throw new System.NotImplementedException();
}

在上面的示例中,所有類都應該實現IPackage接口

看起來你想根據傳遞的類型創建實例......你需要像工廠模式這樣的東西。 我想你應該重新考慮你的設計

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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