c# - 使用泛型进行显式转换

标签 c# generics type-conversion

<分区>

我有一个代码片段:

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 类型,您正试图将其转换为 TT 可以是任何类型,所以编译器认为,“我很确定你肯定不能将 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,但只有 objectIMyInternalClassMyInternalClass 有效T.

因此,这似乎是对泛型的误用。您应该只返回一个 MyInternalClassIMyInternalClass:

public MyInternalClass GetInternalObject()
{
    return _internalObject;
}
// or
public IMyInternalClass GetInternalObject()
{
    return _internalObject;
}

关于c# - 使用泛型进行显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53533964/

相关文章:

c# - 如何确定我刚安装的 MSI 是否请求 Windows 重新启动?

c# - 为什么动态转换会抛出异常?

json - 来自字符串的通用类型

javascript - 为什么 JavaScript 的 parseInt(0.0000005) 打印 "5"?

c# - 将标签文本的一部分设置为粗体

按钮提交前的 Javascript 函数

java - 文本 "<? >"有什么特殊含义吗?

java - 通用 java 删除如何影响 newInstance() 的使用?

swift - 如何在 Swift 3 中将 Any 转换为 CGFloat

string - slice 无法转换为字符串