重载"设置为等于"运算符

Bre*_*len 2 .net c# struct operator-overloading

我正在通过CodeBetter.com 阅读商业基元并且正在考虑这个想法.

以他的Money为例,如何以类似于常规值类型的方式实现它?

我的意思是这样做:

Money myMoney = 100.00m;
Run Code Online (Sandbox Code Playgroud)

代替:

Money myMoney = new Money(100.00m);
Run Code Online (Sandbox Code Playgroud)

我理解如何覆盖所有操作符以允许执行数学等功能,但我不知道需要重写什么以允许我正在尝试做的事情.

这样做的想法是最小化实现新类型时所需的代码更改,并保持与原始类型相同的想法,只需使用不同的值类型名称和业务逻辑功能.

理想情况下,我会继承Integer/Float/Decimal或任何需要的东西,并根据需要覆盖,但显然结构不可用.

jas*_*son 7

你可以提供一个隐式转换操作符decimalMoney像这样:

class Money {
    public decimal Amount { get; set; }
    public Money(decimal amount) {
        Amount = amount;
    }
    public static implicit operator Money(decimal amount) {
        return new Money(amount);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Money money = 100m;
Console.WriteLine(money.Amount);
Run Code Online (Sandbox Code Playgroud)

现在,这里发生的事情并不是我们正在重载赋值运算符; 这在C#中是不可能的.取而代之的是,我们正在做的是提供一个操作符可以隐式转换一个decimalMoney必要的时候.在这里,我们尝试将十进制文字分配给100m类型的实例Money.然后,在幕后,编译器会调用我们定义的隐式转换操作,并使用指定投给实例的结果moneyMoney.如果您想了解其机制,请阅读C#3.0规范的§7.16.1和§6.1.

请注意,decimal如上所示,模拟钱的类型应该是引擎盖下的.