我有一个代码片段:
public interface IMyInternalClass
{
}
public class MyInternalClass : IMyInternalClass
{
}
public interface IMyClass
{
T GetInternalObject<T>();
}
public class MyClass: IMyClass
{
private readonly MyInternalClass _internalObject;
public T GetInternalObject<T>()
{
return (T)(IMyInternalClass)_internalObject;
}
public MyClass(MyInternalClass internalObject)
{
_internalObject = internalObject;
}
}
GetInternalObject<T>
用法:
IMyInternalClass internalObject = myClass?.GetInternalObject<IMyInternalClass>();
如果我尝试通过 return (T)_internalObject;
使用显式转换- 它不会工作并且会失败并出现错误“无法将类型‘MyInternalClass’转换为‘T’”
那么,在不触及此代码示例的设计的情况下,我为什么要将其显式转换为 (IMyInternalClass)
?第一?
There is another question Cannot convert type: why is it necesssary
to cast twice? but there is no information regarding interface usage as
in this case.
Why do you need to cast to object
first?
_internalObject
属于 MyInternalClass
类型,您正试图将其转换为 T
。 T
可以是任何类型,所以编译器认为,“我很确定你肯定不能将 MyInternalClass
转换为任何类型。”。如果先将其转换为 object
,那么编译器会认为“此 object
类型的值在运行时可以是任何类型,因此可以将其转换为任何类型。”
如果您不满意,这里有另一个使用规范的解释。
根据 C# 规范第 6.2.7 节“涉及类型参数的显式转换”:
Explicit reference conversions
The following explicit conversions exist for a given type parameter T:
- From the effective base class C of T to T and from any base class of C to T. At run-time, if T is a value type, the conversion is executed as an unboxing conversion. Otherwise, the conversion is executed as an explicit reference conversion or identity conversion.
- From any interface type to T. At run-time, if T is a value type, the conversion is executed as an unboxing conversion. Otherwise, the conversion is executed as an explicit reference conversion or identity conversion.
- ...
T
的有效基类是 object
,这就是为什么您可以执行此转换。
也就是说,您在这里所做的似乎是个坏主意。这段代码非常不安全。您可以将任何类型传递给 T
,但只有 object
、IMyInternalClass
和 MyInternalClass
对 有效T
.
因此,这似乎是对泛型的误用。您应该只返回一个 MyInternalClass
或 IMyInternalClass
:
public MyInternalClass GetInternalObject()
{
return _internalObject;
}
// or
public IMyInternalClass GetInternalObject()
{
return _internalObject;
}