2009-03-09 15 views
6

को देखते हुए " 'वापसी' बयान में बदलें" नियमित निम्नलिखित:Resharper जाल

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    if (def.Fraction > 0) 
    return Double.Parse(token); 
    else 
    return Int64.Parse(token); 
} 

Resharper मुझे त्रिगुट ऑपरेटर के साथ एक बयान में यह refactor करने के लिए विकल्प प्रदान करता है:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); 
} 

कौन कर सकता है जाल स्पॉट?

+0

http://cznp.com/s/7JM –

उत्तर

11

ठीक है, पिछले उत्तर में बदलें। क्योंकि Int64 से Double (लेकिन विपरीत नहीं) से एक अंतर्निहित रूपांतरण है, जो अभिव्यक्ति का परिणाम प्रकार होगा। तो जब आप Int64 बॉक्सिंग प्राप्त करने की अपेक्षा करते हैं, तो आपको वास्तव में Double बॉक्सिंग मिलता है (लेकिन उस मान के साथ जो मूल रूप से Int64.Parse से आया था)।

बस अगर यह पर्याप्त स्पष्ट नहीं है, तो हम सभी return कथनों को बदल दें जैसे कि वे केवल एक चर वापस कर दें।

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    if (def.Fraction > 0) 
    return Double.Parse(token); 
    else 
    return Int64.Parse(token); 
} 

Convert कि उचित रूप से:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    if (def.Fraction > 0) 
    { 
    double d = Double.Parse(token); 
    object boxed = d; // Result is a boxed Double 
    return boxed; 
    } 
    else 
    { 
    long l = Int64.Parse(token); 
    object boxed = l; // Result is a boxed Int64 
    return boxed; 
    } 
} 

और अब के सशर्त ऑपरेटर के साथ संस्करण के लिए भी ऐसा ही करते हैं:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); 
} 

हो जाता है

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    // The Int64.Parse branch will implicitly convert to Double 
    double d = def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); 
    object boxed = d; // *Always* a Double 
    return boxed; 
} 
यहाँ मूल कोड है

संपादित करें: अपेक्षित के रूप में sted, थोड़ा और जानकारी। प्रपत्र

X ? Y : Z 

की एक सशर्त अभिव्यक्ति के प्रकार Y और Z के प्रकार है, जो मैं TY और TZ फोन करता हूँ पर निर्भर करता है। वहाँ कुछ ही विकल्प हैं:

  • TY और TZ एक ही प्रकार हैं: नतीजा यह है कि प्रकार है
  • वहाँ TY से TZ को नहीं बल्कि TZ से TY को एक अंतर्निहित रूपांतरण है: परिणाम प्रकार TZ और की है रूपांतरण का उपयोग तब किया जाता है जब पहली शाखा का उपयोग किया जाता है।
  • TZ से TY के लिए, लेकिन नहीं TY से TZ को एक अंतर्निहित रूपांतरण नहीं है: परिणाम प्रकार TY की है और रूपांतरण करता है, तो दूसरी शाखा प्रयोग किया जाता है प्रयोग किया जाता है।
  • दोनों दिशाओं में एक अंतर्निहित रूपांतरण नहीं है: संकलन-टाइम त्रुटि
  • बिना किसी रूपांतरण किसी भी तरह के होते हैं: संकलन-टाइम त्रुटि

कि मदद करता है?

+0

यह मुझे पहले मिला ... – leppie

+0

मैंने इसे कोडप्रोजेक्ट पर लगभग 6 महीने पहले पोस्ट किया था। वास्तव में, यह डरावना है कि एक पूर्णांक निश्चित रूप से एक डबल है, भले ही यह सटीक ढीला हो। – leppie

+0

क्या आप शायद दो या दो बार जोड़ सकते हैं कि अंतर्निहित रूपांतरण डबल क्यों होता है?(संभवतः टर्नरी/सशर्त ऑपरेटर की कुछ संपत्ति) – Miles