【发布时间】: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