C# 为什么要使用隐式/显式运算符?
检查以下代码:C# 为什么要使用隐式/显式运算符?,c#,implicit-conversion,explicit-conversion,C#,Implicit Conversion,Explicit Conversion,检查以下代码: class Money { public Money(decimal amount) { Amount = amount; } public decimal Amount { get; set; } public static implicit operator decimal(Money money) { return money.Amount; } public static
class Money
{
public Money(decimal amount)
{
Amount = amount;
}
public decimal Amount { get; set; }
public static implicit operator decimal(Money money)
{
return money.Amount;
}
public static explicit operator int(Money money)
{
return (int)money.Amount;
}
}
我不明白它在我的代码中有什么用处,我能不能只做一个如下的方法:
public static int returnIntValueFrom(Money money)
{
return (int)money.Amount;
}
实施起来不是更容易、更清晰吗?这样做是为了允许资金被添加到其他资金中。如果没有这段代码,这将导致编译器错误,“运算符“+”不能应用于“Money”和“int”类型的操作数”
有了casting操作符,就可以在不引发异常的情况下进行这些类型的转换。它有助于提高可读性,并允许多态性,例如,不同的货币可以实现自己的类型转换。您认为什么允许您编写类似于
return(int)money.Amount代码>在你的代码中?这是一个在Microsoft培训工具包中找到的示例,(考试参考文献70-483 C#中的编程,Wouter de Kort,O'Reilly,2013(第110页第2章创建和使用类型))@WilnerAvila-一旦你获得了20%的声誉,你就可以在。这是一种更好的快速解释格式。@TravisJ哦,谢谢,我不知道@这是一种所谓的合成糖。做10+(Money)33比做10+returnInvValueFrom(33)更清楚。虽然你的主要观点是正确的,但它实际上不会抛出异常,除非你是这样引用编译时错误的。@500 InternalServerError-你是对的,这是一个编译时错误,我将编辑我的答案。这太棒了,我从来不知道隐式强制转换操作符允许你做这种事情。隐式强制转换本质上是不好的(这里有一个原因),你应该完全避免它们,而不是建议它们。与其定义隐式cast操作符,不如实现+
操作符-公共静态货币操作符+(货币,十进制金额)
。这使您的意图更加清晰。@NikolaDimitroff:隐式运算符在封装标识而不是值的引用类型上是不好的。我会假设从T到U的隐式操作符是好的,然后给出T;u1,u2
(T)u1==u2
应拒绝编译、抛出异常或测试u1
和u2
之间的相等性。请注意,.NET有许多转换,对于这些转换,代码将编译并运行,而不会引发异常,但不会正确地测试相等性。
Money money = new Money(5.35m);
decimal net = money + 6;