2013-08-12 3 views
5

Проверьте код ниже:Почему я должен использовать неявный/явный оператор?

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; 
} 

Не было бы проще и понятнее для реализации ?

+5

Как вы думаете, что вы можете написать так, как 'return (int) money.Amount;' в вашем коде? – mbeckish

+0

Thats образец, найденный в учебном комплекте Microsfot, (Exam Ref 70-483 Programming in C#, Wouter de Kort, O'Reilly, 2013 г.) –

+0

@WilnerAvila - Как только вы доберетесь до 20 вы всегда можете задавать эти типы вопросов «Я не понимаю» в [C# чате] (http://chat.stackoverflow.com/rooms/7/c). Это лучший формат для быстрых объяснений, чем SO. –

ответ

5

Это делается для того, чтобы деньги можно было добавить к другим деньгам. Без этого куска кода, это приведет к ошибке компиляции, «Оператор„+“не может быть применен к операндам типа„Деньги“и" INT»

Money money = new Money(5.35m); 
decimal net = money + 6; 

С оператором литья настоящего позволяет эти типы конверсии, которые должны быть сделаны без исключения исключения. Он может помочь в удобочитаемости и разрешить полиморфизм, когда различные валюты могут реализовывать свои собственные типы приведений, например.

+0

Хотя ваш основной вопрос верен, на самом деле это не вызовет исключения, если только вы не ссылаетесь на ошибки времени компиляции. –

+0

@ 500-InternalServerError - Вы правы, это была ошибка времени компиляции, и я отредактирую свой ответ. –

+0

Это потрясающе, я никогда не знал, что неявный оператор броска позволил вам делать такие вещи. – McGarnagle