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

use*_*323 4 c# generics

我写了以下方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

我检查T是什么类型,根据这个我对待我的变量.当我想要返回它时,我得到编译器错误.

" ComponentInformationPackage类型不能隐式转换为T"

我怎么解决这个问题?

Pet*_*erg 8

第一:如果演员不起作用,安全演员阵容确实有效:

return CompInfoPackage as T;
Run Code Online (Sandbox Code Playgroud)

......如果有以下class限制T:

public static T CreatePackage<T>() where T : class, new() { ... }
Run Code Online (Sandbox Code Playgroud)

第二:鉴于此代码:

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

    // ...

    return (T)compInfoPackage; 
}
Run Code Online (Sandbox Code Playgroud)

...你已经有了package对新对象的引用.由于它是类型T,编译器已经将它作为返回类型.为什么不回归呢?

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

    // ...

    return package; // Same object as compInfoPackage
}
Run Code Online (Sandbox Code Playgroud)


Him*_*ere 3

您必须强制转换为,因为您的方法返回notT的实例。TComponentInformationPackage

\n\n
return (T)CompInfoPackage;\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译器没有机会知道它T实际上是一个ComponentInformationPackage. 然而,正如您之前已经检查过的那样,此转换可能永远不会失败。

\n\n

但是 I\xc2\xb4m 不确定为什么你有一个泛型类型,因为ComponentInformationPackage你的方法只处理 的实例。省略类型参数和约束并简单地返回您已经执行的操作。

\n\n

编辑:我已经在注释中提到过,您也可以返回package(不进行任何强制转换),因为编译器已经知道这packageT. 然而,你拥有的最后一次机会return (T)(object) CompInfoPackage对我来说似乎很奇怪。

\n