注意:我使用的是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的类型将是什么,因此我会得到以下错误:
error CS1502:'BinarySerialiser.encode_any(System.IO.BinaryWriter, bool)'的最佳重载方法匹配有一些无效的参数 error CS1503:参数'#2'不能将'T'表达式转换为类型'bool'
我注意到这并不特别与布尔值有关,如果我重新排列我的encode_any函数的顺序,它总是尝试使用最后一个。也许它只是尝试每个函数,然后在用完备选项后才发出错误。
这种代码在C ++下工作得很好,其中writeValue仅在已知T时编译,但在这里似乎不是这种情况,我怀疑这是因为C#在运行时处理通用类型。
我能改变我的方法使其工作吗?如果可以,那该怎么做?