2

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

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)' 的最佳重载方法匹配有一些无效参数

我试图避免编写包含每个原始类型的长 switch 语句,并为选择类型的方法添加一个参数。这是丑陋的,似乎不正确。

这是简单而优雅的:

  • 发送<int>(123);
  • 发送<布尔>(真);

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

4

1 回答 1

3

重载解决是在编译时执行的。所以编译器试图找到一个带有参数的方法,该参数将是有效的*无论类型T是什么,(在其约束范围内,这在这里没有帮助)。它找不到这样的方法。鉴于唯一的约束是T必须是结构,唯一有效的非泛型参数类型将是object(通过装箱)。

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

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

...或使用反射获取并执行正确的重载(这是动态类型所做的)。

于 2012-07-06T20:53:59.170 回答