【发布时间】:2011-08-22 21:25:33
【问题描述】:
注意:我使用的是 Mono 环境,如果这会有所不同的话。
我正在编写一些测试,为此我提供了以下通用方法:
static MemoryStream writeValue<T>(T inVal)
{
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
encode_any(bw, inVal);
return ms;
}
这个想法是这将调用我的encode_any 重载之一,它委托给特定类型的方法:
public static void encode_any(BinaryWriter writer, Int32 val) { encode_int32(writer, val); }
public static void encode_any(BinaryWriter writer, Int64 val) { encode_int64(writer, val); }
public static void encode_any(BinaryWriter writer, Float val) { encode_float(writer, val); }
...etc...
public static void encode_any(BinaryWriter writer, bool val) { encode_bool(writer, val); }
我想这样做的原因是,我可以在每种情况下调用正确的实现,而无需多个版本的“writeValue”,也无需在选择调用哪个 encode_ 函数之前检查每个项目的运行时类型。
但是,编译器似乎正在尝试解决 writeValue 的重载,但不知道 T 将是什么类型,所以我收到此错误:
错误 CS1502:“BinarySerialiser.encode_any(System.IO.BinaryWriter, bool)”的最佳重载方法匹配有一些无效参数 错误 CS1503:参数“#2”无法将“T”表达式转换为“bool”类型
我注意到这不是专门针对 bool 的——如果我重新排列我的 encode_any 函数的顺序,它总是会尝试使用最后一个。也许它只是尝试每一个,然后只在用完替代品时才发出错误。
这种代码在 C++ 下可以正常工作,其中 writeValue 仅在 T 已知时编译,但这里似乎不是这种情况,我怀疑这是因为 C# 在运行时处理泛型类型。
我可以改变我的方法来完成这项工作吗?如果可以,如何?
【问题讨论】: