转换为原始类型并使用as参数?

时间:2012-07-06 20:49:52

标签: c# casting primitive-types

我正在尝试编译包含此方法的项目;

public void Send<T>(object o) where T : struct {
    BinaryWriter bw = new BinaryWriter(stream);
    bw.Write((T)o);
}

我从这种方法(工作)中获得灵感;

public static T Cast<T>(object o) {
    return (T)o;
}

BinaryWriter.Write函数支持参数的基本类型,所以我想我可以这样使用它。但是,Visual Studio说“最好的重载方法匹配'System.IO.BinaryWriter.Write(bool)'有一些无效的参数

我正在尝试避免编写包含每种基本类型的long switch语句,并在方法中添加一个参数来选择类型。这很难看,似乎不对。

这很简单而优雅:

  • 发送&LT; INT&GT;(123);
  • 发送&LT;布尔&GT;(真);

但为什么它不起作用?什么是正确的方法呢?

1 个答案:

答案 0 :(得分:3)

重载分辨率在编译时执行。因此,编译器试图找到一个参数,该参数将是有效的* T类型的任何类型,(在其约束条件下,这对此没有帮助)。它找不到这样的方法。鉴于唯一的约束是T必须是结构,只有非泛型参数类型才有效object(通过装箱)。

如果您的目标是根据对象的执行时间类型使用适当的重载,则需要使用动态类型,如下所示:

public void Send(dynamic d) {
    BinaryWriter bw = new BinaryWriter(stream);
    bw.Write(d);
}

...或者使用反射获取并执行正确的重载(这是动态类型将要执行的操作)。