c# - 将原始类型转换为泛型类型?
问题描述
我正在解析二进制文件。因此,我写了类似于以下内容的内容:
public T Parse<T>(BinaryReader reader)
{
if (typeof(T) == typeof(byte))
return reader.ReadByte();
else if (typeof(T) == typeof(int))
return reader.ReadInt32();
// ...
}
但是,这不会编译:
无法将类型“...”隐式转换为“T”
我这样做会很方便。
如何从泛型方法返回任何原语?
解决方案
这在检查运行时类型的通用代码中相当常见。您必须向上转换为对象,然后向下转换为通用 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 压力,因此它可能对性能敏感的代码不利。
推荐阅读
- javascript - 带有 java 脚本的 DropDownList
- laravel - 精益雄辩的结果 ->with() 渴望加载
- python - 如何在每一行中的特定字符串之后计算文本文件中的唯一单词?
- php - Symfony Fileloader 找不到现有的类
- javascript - 处理 Flask 文件上传/下载中的编码
- html - CSS - 文本在顶部对齐,不管 flexbox 属性如何
- json - 是否可以从 newrelic 警报中获取未决事件计数
- matlab - 如何将 GUIDE 的导出工具生成的 MATLAB GUI *.m 文件转换回 *.fig 文件?
- mysql - 从 SQL 数据库中提取一个整数值用于计算
- python-3.x - 使用 Anaconda 的 Sublime 3 中的 Numpy 错误