Jeśli mam jakiś kod tak:Dlaczego muszę zawinąć ten kod w rzutowanie?
short myShortA = 54;
short myShortB = 12;
short myShortC = (short)(myShortA - myShortB);
Oba argumenty są szorty i to się dzieje w krótkim więc dlaczego mam ją rzucić?
Jeśli mam jakiś kod tak:Dlaczego muszę zawinąć ten kod w rzutowanie?
short myShortA = 54;
short myShortB = 12;
short myShortC = (short)(myShortA - myShortB);
Oba argumenty są szorty i to się dzieje w krótkim więc dlaczego mam ją rzucić?
Ponieważ nie ma operatora "krótki - krótki". Oba operandy są promowane do int.
Z sekcji 7.7.5 z C# 3 specyfikacji:
operatorom predefiniowany odejmowanie są wymienione poniżej. Operatory wszystkie odejmują y od x.
Integer odejmowanie:
int operator –(int x, int y); uint operator –(uint x, uint y); long operator –(long x, long y); ulong operator –(ulong x, ulong y);
W sprawdzonej kontekście, jeśli różnica jest poza zasięgiem typu wynikowego, System.OverflowException jest wyrzucane.
(. A wtedy nie zmiennoprzecinkowych odejmowanie)
Żeby było trochę łatwiej, można po prostu napisać metodę rozszerzenia takiego:
public static class NumericExtensions
{
public static short Subtract(this short target, short value)
{
return (short)(target - value);
}
}
Inni odpowiedział twoje pytanie ... :)
Jeśli tylko pozwolili operatorom rozszerzeń ...;) – RCIX
Eric Lippert skomentował to (w odniesieniu do Enums) : http://blogs.msdn.com/ericlippert/archive/2005/10/19/fyi-c-2-0-has-a-breaking-change-in-enum-subtraction.aspx – jasonh
Często chciałem to w kilku językach ... ale potem pamiętam, ilu ludzi nadużywa tego. –