Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要使用隐式/显式运算符?_C#_Implicit Conversion_Explicit Conversion - Fatal编程技术网

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;