2012-12-29 19 views
5

का उपयोग कर WriteLine प्रदर्शन जब मैं कोड के इस बिट चलाने के लिए, Equation(10, 20) कंसोल के लिए उत्पादन होता है एक if तो मैं Boolean लिए अंतर्निहित रूपांतरण के लिए अनुमति दी:समर्थन रूपांतरण, लेकिन अभी भी ToString

public class Equation 
{ 
    public int a; 
    public int b; 

    public override string ToString() 
    { return "Equation(" + a + ", " + b + ")"; } 

    public static implicit operator Boolean(Equation eq) 
    { return eq.a == eq.b; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (new Equation() { a = 10, b = 10 }) 
      Console.WriteLine("equal"); 

     Console.WriteLine(new Equation() { a = 10, b = 20 }); 

     Console.ReadLine(); 
    } 
} 

हालांकि, मुसीबत जब मैं एक Equation पर WriteLine उपयोग करते हैं, यह टी परिवर्तित मिलता है, अब ToString का उपयोग करके मुद्रण के बजाय Boolean

मैं Boolean पर निहित रूपांतरण की अनुमति कैसे दे सकता हूं और अभी भी ToString का उपयोग कर WriteLine डिस्प्ले है?


अद्यतन

यह सवाल SymbolicC++ में Equation वर्ग से प्रेरित है। नीचे दिए गए कोड को दिखाता है कि एक Equationcout के माध्यम से प्रदर्शित किया जा सकता है और साथ ही एक if की कसौटी में इस्तेमाल किया:

auto eq = x == y; 

cout << eq << endl; 

if (eq) 
    cout << "equal" << endl; 
else 
    cout << "not equal" << endl; 

तो यह किसी भी तरह सी में संभव है ++।

उत्तर

7

आप एक bool रूपांतरण के साथ यह नहीं कर सकते, लेकिन आप को ओवरलोड कर सकते हैं true और falseEquation के लिए ऑपरेटरों। बेशक Equation परोक्ष किसी भी अधिक bool के लिए परिवर्तनीय नहीं होगा लेकिन आप अभी भी if, while, do, और for बयानों और सशर्त भाव (अर्थात ?: ऑपरेटर) में इसका इस्तेमाल कर सकते हैं।

public class Equation 
{ 
    public int a; 
    public int b; 

    public override string ToString() 
    { return "Equation(" + a + ", " + b + ")"; } 

    public static bool operator true(Equation eq) 
    { 
     return eq.a == eq.b; 
    } 

    public static bool operator false(Equation eq) 
    { 
     return eq.a != eq.b; 
    }  
} 

अपने उदाहरण से:

if (new Equation() { a = 10, b = 10 }) 
    Console.WriteLine("equal"); // prints "equal" 

Console.WriteLine(new Equation() { a = 10, b = 20 }); // prints Equation(10, 20) 
+0

वाह, आपने इसे माइक को दबाया। धन्यवाद! – dharmatech

+0

जबकि आपके द्वारा सूचीबद्ध बयानों में 'समीकरण' कार्य करते समय, ऐसा लगता है कि वे ऑपरेटरों '||' और '&&' के साथ काम नहीं करते हैं। बस सोचा कि मैं इस विकल्प पर विचार कर रहे लोगों के लिए इसका जिक्र करूँगा। – dharmatech

+0

@ धर्माटेक जैसा कि मैंने कहा था कि यह अब 'बूलियन' में परिवर्तनीय नहीं है। आप '&' और '| 'ऑपरेटरों को भी अधिभारित कर सकते हैं, लेकिन यह सीमित उपयोग होगा क्योंकि आप अभी भी' eq && true 'जैसी कुछ नहीं कर पाएंगे। मैं वास्तव में जॉन की टिप्पणी से सहमत हूं कि इस तरह की चीज थोड़ा बहुत चालाक है और आपके कोड और भविष्य के रखरखाव दोनों उपभोक्ताओं के लिए भ्रमित होने की संभावना है। –

12

जहां तक ​​मैं कह सकता हूं, आप नहीं कर सकते। आप भी स्ट्रिंग में रूपांतरण प्रदान कर सकते हैं ... लेकिन फिर यह WriteLine(string) और WriteLine( बूल` के बीच संदिग्ध कॉल करेगा)।

व्यक्तिगत रूप से मैं दृढ़ता से अनुशंसा करता हूं कि आप Boolean पर अंतर्निहित रूपांतरण को हटा दें। लागू रूपांतरण लगभग हमेशा एक बुरा विचार है। वे कोड को और अधिक भ्रमित करते हैं, साथ ही साथ आपको अनदेखा अधिभार परिवर्तन भी मिलते हैं।

(मैं भी अपने ब्रेसिंग शैली को बदल देंगे, लेकिन यह एक अलग बात है।)

+2

तुम वास्तव में कर सकते हैं) – SergeyS

+0

जॉन, 'माइक z' से जवाब की जाँच करें। यह वही करता है जो मैं ढूंढ रहा हूं। क्या आप उस दृष्टिकोण में कोई कमी देखते हैं? – dharmatech

+11

@ धर्माटेक: वैसे यह सवाल का जवाब नहीं देता है जैसा कि आपने इसे रखा है, जो कि 'बूल' में अंतर्निहित रूपांतरण रखना है। निजी तौर पर मैं 'सत्य' और 'झूठी' ऑपरेटरों को अधिभारित नहीं करता - मैं चीजों को और अधिक स्पष्ट रखूंगा। मुझे लगता है कि इस तरह के ऑपरेटरों के साथ "प्यारा" होने का प्रयास आमतौर पर उस कोड को जाता है जो बनाए रखना कठिन होता है। निश्चित रूप से वाईएमएमवी - लेकिन मैं बहुत सावधान रहूंगा। –

8

इसका कारण यह है Console.WriteLine (bool) अधिभार Console.WriteLine (वस्तु) के बजाय कहा जाता है। आप स्पष्ट रूप से विरोध करने डाली और आवश्यक अधिभार बुलाया जाएगा कर सकते हैं:

Console.WriteLine((object)(new Equation() { a = 10, b = 20 })); 

या वैकल्पिक रूप से expliciltly फोन .ToString():

Console.WriteLine((new Equation() { a = 10, b = 20 }).ToString()); 
संबंधित मुद्दे