首页 > 解决方案 > 将原始类型转换为泛型类型?

问题描述

我正在解析二进制文件。因此,我写了类似于以下内容的内容:

public T Parse<T>(BinaryReader reader)
{
    if (typeof(T) == typeof(byte))
        return reader.ReadByte();
    else if (typeof(T) == typeof(int))
        return reader.ReadInt32();
    // ...
}

但是,这不会编译:

无法将类型“...”隐式转换为“T”

我这样做会很方便。

如何从泛型方法返回任何原语?

标签: c#.net-coretype-conversion

解决方案


这在检查运行时类型的通用代码中相当常见。您必须向上转换为对象,然后向下转换为通用 T。这是因为编译器不“知道”字节可以直接转换为 T,即使由于类型检查它与 T 相同。

public T Parse<T>(BinaryReader reader)
{
    if (typeof(T) == typeof(byte))
        return (T)(object)reader.ReadByte();
    else if (typeof(T) == typeof(int))
        return (T)(object)reader.ReadInt32();
    // all returns will need similar casts
}

这样做的缺点是对对象的强制转换会导致装箱操作并增加 GC 压力,因此它可能对性能敏感的代码不利。


推荐阅读