2010-01-13 8 views
8

निम्नलिखित में:एक लघु पर यूनरी माइनस एक int बन जाता है?

public class p 
{ 
    short? mID; 
    short? dID; 
} 

short id = p.mID ?? -p.dID.Value; 

संकलक मुझे त्रुटि देता है:

Error 21 Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)

मैं इसे काम करने के लिए निम्नलिखित के लिए कोड बदलने के लिए:

short id = p.mID ?? (short)-p.dID.Value; 

यह रूप में है अगर संकलक कुछ ऐसा कर रहा है (int) 0 - p.dID.Value, या वह Int16.operator - Int32s लौटा रहा है ...?

उत्तर

13

मैं विनिर्देश, जिसमें कहा गया है की धारा 7.6.2 का उल्लेख:


रूप -x के एक ऑपरेशन के लिए, एकल ऑपरेटर अधिभार संकल्प विशिष्ट ऑपरेटर कार्यान्वयन चयन करने के लिए लागू किया जाता है। ऑपरेंड को चयनित ऑपरेटर के पैरामीटर प्रकार में परिवर्तित कर दिया जाता है, और परिणाम का प्रकार ऑपरेटर का रिटर्न प्रकार होता है। पूर्वनिर्धारित निषेध ऑपरेटरों हैं:

पूर्णांक निषेध:

int operator –(int x); 
long operator –(long x); 

परिणाम शून्य से एक्स को घटा कर की जाती है। यदि एक्स का मान ऑपरेंड प्रकार का छोटा प्रतिनिधित्व करने योग्य मान है (int^-2^63 के लिए int या -2^63 लंबे समय तक), तो x का गणितीय अस्वीकरण ऑपरेंड प्रकार के भीतर प्रदर्शित नहीं होता है। यदि यह किसी चेक किए गए संदर्भ में होता है, तो एक सिस्टम। ओवरफ्लो एक्सेप्शन फेंक दिया जाता है; यदि यह एक अनचेक संदर्भ में होता है, तो परिणाम ऑपरेंड का मान होता है और ओवरफ़्लो की रिपोर्ट नहीं की जाती है। यदि निषेध ऑपरेटर का संचालन यूंट प्रकार का है, तो इसे लंबे समय तक परिवर्तित कर दिया जाता है, और परिणाम का प्रकार लंबा होता है। एक अपवाद नियम है जो int मान -2147483648 (-2^31) को एक दशमलव पूर्णांक अक्षर के रूप में लिखा जाने की अनुमति देता है।

यदि निगमन ऑपरेटर का ऑपरेशन टाइप उलंग है, तो संकलन-समय त्रुटि होती है। एक अपवाद नियम है जो लंबे मूल्य -9223372036854775808 (-2^63) को एक दशमलव पूर्णांक शाब्दिक के रूप में लिखा जाने की अनुमति देता है।

फ्लोटिंग सूत्री निषेध:

float operator –(float x); 
double operator –(double x); 

परिणाम एक्स का मान अपने हस्ताक्षर के साथ उलटा है। यदि एक्स NaN है, तो परिणाम भी NaN है।

दशमलव निषेध:

decimal operator –(decimal x); 

परिणाम शून्य से एक्स को घटा कर की जाती है। दशमलव अस्वीकार प्रकार सिस्टम के असीमित ऋण ऑपरेटर का उपयोग करने के बराबर है। डेसिमल।


जैसा कि आप देख सकते हैं, शॉर्ट्स पर परिभाषित कोई यूनरी माइनस ऑपरेटर नहीं है; ओवरलोड रिज़ॉल्यूशन एक को इट्स पर चुनता है क्योंकि वह सभी उपलब्ध यूनरी माइनस ऑपरेटरों का सबसे अच्छा मैच है।

+1

ग्रेट उत्तर; धन्यवाद! मुझे आश्चर्य है कि शॉर्ट्स पर परिभाषित कोई यूनरी माइनस ऑपरेटर क्यों नहीं है। कोई सिद्धांत? – rabidpebble

+0

@rabidpebble यह निश्चित रूप से, सभी (सभी?) बाइनरी ऑपरेटरों के लिए समान है। उदाहरण के लिए 'p.mID + p.mID',' p.mID/p.mID', 'p.mID और p.mID' और कई अन्य सभी के पास 'int' टाइप होगा, भले ही दोनों ऑपरेशंस' शॉर्ट ' । –

2

कोई यूनरी माइनस ऑपरेटर नहीं है जो एक छोटा सा मूल्य लेता है। इसके बजाए, अधिभार संकल्प यूनरी माइनस ऑपरेटर के int संस्करण को चुनता है और एक निहित रूपांतरण करता है।

संबंधित मुद्दे