代码之家  ›  专栏  ›  技术社区  ›  Brett Allen

重载“设为等于”运算符

  •  2
  • Brett Allen  · 技术社区  · 16 年前

    Business Primitives 被CodeBetter.com下载,当时正在玩弄这个想法。

    以他的货币为例,人们将如何实现这一点,使其与常规价值类型类似?

    我的意思是这样做:

    Money myMoney = 100.00m;
    

    而不是:

    Money myMoney = new Money(100.00m);
    

    我知道如何覆盖所有运算符,以允许函数进行数学运算等,但我不知道需要覆盖什么以允许我尝试执行的操作。

    理想情况下,我会继承Integer/Float/Decimal或任何需要的内容,并根据需要进行重写,但显然这对结构不可用。

    3 回复  |  直到 16 年前
        1
  •  7
  •   jason    16 年前

    你可以提供一个 implicit cast operator 从…起 decimal 到 Money 像这样:

    class Money {
        public decimal Amount { get; set; }
        public Money(decimal amount) {
            Amount = amount;
        }
        public static implicit operator Money(decimal amount) {
            return new Money(amount);
        }
    }
    

    用法:

    Money money = 100m;
    Console.WriteLine(money.Amount);
    

    现在,这里发生的不是我们重载赋值运算符;这在C#中是不可能的。相反,我们所做的是提供一个可以隐式强制转换 到 钱 必要时。这里我们试图分配十进制文本 100m 类型的实例 钱 . 然后,在幕后,编译器将调用我们定义的隐式强制转换操作符,并使用该操作符将强制转换的结果分配给实例 money 属于 . 如果您想了解其机制,请阅读C#3.0规范的§7.16.1和§6.1。

    请注意,模型货币的类型应为 在引擎盖下,如我上面所示。

        2
  •  0
  •   Ravisha    16 年前

    请通读一遍,以便更清楚地了解这一点 http://www.csharphelp.com/2006/03/c-operator-overloading/

        3
  •  0
  •   Alex LE    16 年前

    无法在C#中定义赋值运算符,但对于此类赋值,可以重载隐式强制转换运算符:

    public static implicit operator Money(double value)
    {
        return new Money(value);
    }
    

    注: