【问题标题】:C# Implicit operators and ToString()C# 隐式运算符和 ToString()
【发布时间】:2010-06-23 09:53:31
【问题描述】:

我正在创建自己的类型来表示 css 值(如像素,例如 12px )。为了能够加/减/乘/...我的类型和整数,我定义了两个隐式运算符来和来自 int。除了一件事,一切都很好。如果我写:

CssUnitBase c1 = 10;
Console.WriteLine(c1);

我得到的是“10”而不是“10px”——使用隐式转换为 int 来代替 ToString() 方法。我怎样才能防止这种情况发生?

【问题讨论】:

  • 您可以将代码发布到CssUnitBase 类吗?从您使用它的方式来看,它似乎 int 的包装器。
  • ut 取决于您如何在内部存储 CssUnitBase 中的值以及如何返回它。 “说话很便宜,给我们看代码”
  • @vaitrafra:我完全不明白这取决于它。存在与 int 之间的隐式转换,以及对 ToString 的覆盖。这些是与这个问题相关的公共 API 的部分,我认为它们的实现根本不重要。这就是所谓的相关。
  • 重要的是编译器选择了哪个 WriteLine 重载。它选择 int 是因为存在有效的转换。 ToString 在内部由 WriteLine 调用,因此它与编译器选择哪个重载无关。
  • 你将不得不做一些明确的事情来强制 WriteLine 实际显示你的 ToString 方法的输出,因为如果你添加一个运算符来转换为字符串,那么两个重载之间的调用将是模棱两可的无论如何,您都必须对 ToString 进行显式强制转换或显式调用。演示我在说什么的屏幕截图:puu.sh/EeIos/4957898796.png 所以你可能应该说Console.WriteLine(c1.ToString());

标签: c# operator-overloading implicit-conversion


【解决方案1】:

是的,有一个到int 的隐式转换,并且WriteLine(int) 的重载比WriteLine(object) 更具体,所以它会使用它。

你可以显式地调用WriteLine(object)重载:

Console.WriteLine((object)c1);

...或者您可以自己调用ToString,以便调用Console.WriteLine(string)

Console.WriteLine(c1.ToString());

... 或者您可以删除对int 的隐式转换。它对你有多大用处?我一般不赞成这种事情的隐式转换......(如果你真的想要,你可以保留隐式转换来自 int当然。)

【讨论】:

  • 我以另一种方式做到了。到 int 的隐式转换现在是显式的,并且我有 4 个在 CssUnitBase 上操作的运算符 (+-*/) 重载。这样我就有了 - 默认情况下调用 ToString 并且算术运算运行良好(在 int 和 CssUnitBase 操作数的混合上)没有太多代码。像 CssUnitBase * int 这样的所有操作都应该总是返回 CssUnitBase 所以这在各个方面都是我想要的。
  • @kubal5003:这听起来像是正确的做事方式,是的。很高兴它对你有用。
【解决方案2】:

重写“ToString()”方法并使用 c1.ToString()。

【讨论】:

    【解决方案3】:

    只需覆盖CssUnitBase 中的ToString 方法,并在需要时将其作为字符串调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2013-08-25
      • 2010-10-15
      • 2010-12-09
      • 1970-01-01
      • 2014-03-18
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多