我写了以下方法:
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"
我怎么解决这个问题?
第一:如果演员不起作用,安全演员阵容确实有效:
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)
您必须强制转换为,因为您的方法返回notT的实例。TComponentInformationPackage
return (T)CompInfoPackage;\nRun Code Online (Sandbox Code Playgroud)\n\n编译器没有机会知道它T实际上是一个ComponentInformationPackage. 然而,正如您之前已经检查过的那样,此转换可能永远不会失败。
但是 I\xc2\xb4m 不确定为什么你有一个泛型类型,因为ComponentInformationPackage你的方法只处理 的实例。省略类型参数和约束并简单地返回您已经执行的操作。
编辑:我已经在注释中提到过,您也可以返回package(不进行任何强制转换),因为编译器已经知道这package是T. 然而,你拥有的最后一次机会return (T)(object) CompInfoPackage对我来说似乎很奇怪。
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |