【问题标题】:Cannot apply operator '>=' to operator of type X and 'float'无法将运算符“> =”应用于 X 类型的运算符和“浮点”
【发布时间】:2019-11-21 17:21:17
【问题描述】:

我是 stackoverflow 的新手,在这里学习。

如何将运算符“>=”应用于 C# 中的 If 语句,如果它们的数据类型不同?

MyClass usingMyClass = ...; // (instance variable)

if (usingMyClass.MyClass >= price) // price is a float

有什么解决办法吗?

【问题讨论】:

  • 在这种情况下 >= 是什么意思?您的班级如何与花车相提并论?不清楚您要解决什么问题,因此很难提供解决方案。
  • 可以MyClass 上定义比较运算符,但这里真正的问题是为什么首先进行此比较是有意义的。在不了解更多信息的情况下,我会说您可能需要使用 Price 属性进行比较,以便您知道您正在比较语义相似的事物:if (usingMyClass.MyClass.Price >= price)
  • 当您使用它时,请不要使用floatdouble 获取价格。 Use decimal.
  • 您必须打算将这种比较与 mean 某些东西进行比较,所以让我们深入研究一下。 究竟在什么情况下该表达式会导致true
  • 您应该编辑问题以包含所请求的信息,而不是将其留在 cmets 中。

标签: c# if-statement boolean-operations


【解决方案1】:

针对您的具体问题的正确解决方案 -- 如何比较银行账户余额和价格? -- 不是将银行账户与价格进行比较。正确的解决方案是在 account 对象上创建一个属性 Balance 并将 那个 与价格进行比较。


旁白:“银行账户”是一个常见的初学者练习,我希望不是,因为它完全错误地理解了银行账户软件的实际工作原理。在现实世界的银行账户软件中,确定是否有足够的余额来支持特定购买的逻辑发生在多个阶段。提议的工作流程——确定账户是否有足够的资金,如果有,执行交易——是有缺陷的,因为可能发生的情况是可能有 两个 交易在进行中,有足够的现金来支付两者都单独但不是一起,两次检查都成功,两次交易都发生,并且帐户最终透支。设计一个高性能的现实系统并避免这个问题是困难的,而不是初学者练习。

此外,正如我在评论中提到的,真实银行账户软件从来没有“可变余额”。相反,它是自账户开始以来所有交易的最终只写分类账,可以从中计算余额。您永远不希望银行账户中有任何可变的东西,因为那样太容易进行欺诈了。

此外,如 cmets 中所述,切勿使用 float 或 double 来表示货币。使用decimal。它是为这项任务而设计的。对长度、质量或速度等物理量使用浮点数和双精度数。


要回答您的实际问题:要创建一个实现其自己的用户定义比较运算符的类,您可以使用运算符重载。但是,您应该注意很容易出错,尤其是比较运算符。在实现比较逻辑时,我对初学者和专家的建议是实现 一个方法 来进行 所有 比较,然后从 调用该方法每个 重载的运算符。我在这里举一个如何正确执行此操作的示例:

https://ericlippert.com/2013/10/07/math-from-scratch-part-six-comparisons/

请注意,有很多工作要做。您需要重载 <<=>>===!=EqualsGetHashCode 才能正确执行此操作。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多