【问题标题】:Casting to primitive type and using as parameter?转换为原始类型并用作参数?
【发布时间】:2012-07-07 08:13:12
【问题描述】:

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

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 语句,并为选择类型的方法添加一个参数。这很丑陋,而且看起来不对。

这是简单而优雅的:

  • 发送(123);
  • 发送(true);

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

【问题讨论】:

标签: c# casting primitive-types


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不熟悉“动态”关键字,但它似乎有效 :) 我会读一下,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2013-06-19
相关资源
最近更新 更多