2012-05-02 26 views
9

नीचे क्या हो रहा है?इस मामले में स्ट्रिंग में पूर्णांक क्यों परिवर्तित किया गया है?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

public class DotNetPad 
{ 
    public static void Main(string[] args) 
    { 
     int i = 10; 
     string k = "Test"; 
     Console.WriteLine(i+k); 
     Console.WriteLine(k+i); 
    } 
} 

i दोनों मामलों में स्ट्रिंग में परिवर्तित किया जा रहा है। मैं खुद को ऑपरेटर प्राथमिकता के विचार से भ्रमित कर रहा हूं (हालांकि यह उदाहरण उसमें से अधिक नहीं दिखाता है) और मूल्यांकन दिशा। कभी-कभी मूल्यांकन बाएं से दाएं या इसके विपरीत होता है। मुझे वास्तव में विज्ञान का मूल्यांकन करने का विज्ञान नहीं पता है ...

i उपरोक्त उदाहरण में स्ट्रिंग में परिवर्तित क्यों है, और वास्तव में संकलन त्रुटि नहीं दे रहा है?

उत्तर

23
सी # कल्पना से

- खंड 7.7.4 अलावा ऑपरेटर:

स्ट्रिंग संयोजन:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 

द्विआधारी + ऑपरेटर स्ट्रिंग संयोजन जब एक या दोनों ऑपरेंड हैं प्रदर्शन प्रकार स्ट्रिंग का। यदि स्ट्रिंग कॉन्सटेनेशन का ऑपरेंड शून्य है, तो खाली स्ट्रिंग को प्रतिस्थापित किया जाता है। अन्यथा, किसी भी गैर-स्ट्रिंग तर्क को आभासी ToString विधि प्रकार ऑब्जेक्ट से विरासत में डालकर अपने स्ट्रिंग प्रस्तुति में परिवर्तित किया जाता है। यदि ToString शून्य लौटाता है, तो खाली स्ट्रिंग को प्रतिस्थापित किया जाता है।

+2

धन्यवाद - जल्दी से spec पर नहीं जा सका :) –

8

दोनों मामलों में, आपको ऑपरेटर को स्ट्रिंग के साथ एक ऑपरेटरों के साथ मिला है। कोई ओवरलोडेड उपयोगकर्ता-परिभाषित ऑपरेटर शामिल नहीं हैं, इसलिए कंपाइलर स्ट्रिंग कॉन्सटेनेशन स्थितियों के रूप में दोनों का उपयोग करेगा।

जहां तक ​​मुझे पता है हूँ, सी # संकलक हो, तो उपयोगकर्ता-निर्धारित अधिभार, उदा x + y की एक परिदृश्य में जहाँ या तोx या y संकलन समय पर एक string अभिव्यक्ति है के लिए स्ट्रिंग संयोजन का उपयोग केवल नहीं होगा XName operator +(XNamespace, string) ऑपरेटर।

0

वास्तव में "+" ऑपरेटर concatenation के लिए है। एक int और स्ट्रिंग के बीच concatenation बनाना एक स्ट्रिंग (स्वचालित रूप से स्ट्रिंग करने के लिए int int के साथ)

+0

कंसोल में संख्यात्मक चर के बीच "+" का उपयोग करना। राइटलाइन के परिणामस्वरूप आउटपुट में संख्यात्मक चर के लिए उनमें से एक योग होगा। – SoEnLion

18

मैं खुद को ऑपरेटर प्राथमिकता और मूल्यांकन दिशा के विचार से भ्रमित कर रहा हूं।

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

पहला बिंदु आप पर भ्रमित होने का दावा करते हैं पर आप unconfuse, नियम काफी सरल हैं करने के लिए:

  • भाव ऑपरेटर पूर्वता और संबद्धता के अनुसार parenthesized कर रहे हैं।
  • उप-संपीड़न का मूल्यांकन बाएं से दाएं क्रम में किया जाता है।

आपको यह सही करने के लिए जानने की आवश्यकता है।

Q()[R()] = A() * B() + C()/D(); 

पूर्वता और संबद्धता के अनुसार parenthesized है कि:

Q()[R()] = ((A() * B()) + (C()/D())); 

और अब हर मान लीजिए क्यू() एक वस्तु एक सेटर के साथ एक इंडेक्सर है, और अन्य तरीकों सभी वापसी पूर्णांक रिटर्न उप-संपीड़न का मूल्यांकन बाएं से दाएं है। प्रत्येक सबएक्सप्रेस, जिसमें उप-अभिव्यक्तियां हैं जिनमें स्वयं उप-अभिव्यक्तियां हैं। तो यह कार्यक्रम के बराबर है:

var q = Q(); 
var r = R(); 
var a = A(); 
var b = B(); 
var t1 = a * b; 
var c = C(); 
var d = D(); 
var t2 = c/d; 
var t3 = t1 + t2; 

और आखिर में क्यू पर इंडेक्स सेटर को इंडेक्स आर और वैल्यू टी 3 के साथ बुलाया जाता है।

ध्यान दें कि बाईं ओर प्रत्येक उप-संपीड़न का अधिकार प्रत्येक उप-संपीड़न से पहले दाएं किया जाता है। A() * B()C()/D() से बचा है, इसलिए यह पहले होता है।

इसमें आपके प्रश्न के साथ कुछ भी नहीं है। आपका प्रश्न गलतफहमी पर आधारित है।

मुझे पता है कि मैं क्यों ऊपर के उदाहरण में स्ट्रिंग में बदल जाती है चाहते हैं, और वास्तव में एक संकलन त्रुटि

देने नहीं आपके गलतफहमी है। i स्ट्रिंग में कनवर्ट किया जा रहा है। इसे object में परिवर्तित किया जा रहा है। आपका कार्यक्रम बिल्कुल के बराबर है:

int i = 10; 
    string k = "Test"; 
    string t1 = System.String.Concat((object)i, (string)k); 
    Console.WriteLine(t1); 
    string t2 = System.String.Concat((string)k, (object)i); 
    Console.WriteLine(t2); 

जैसा कि आप देख सकते हैं, वहाँ पहली जगह में स्ट्रिंग के लिए i से कोई रूपांतरण नहीं है। i को मुक्केबाजी रूपांतरण के माध्यम से ऑब्जेक्ट में परिवर्तित किया गया है और फिर String.Concat विधि पर भेजा गया है। उस विधि को बॉक्स किए गए पूर्णांक पर object.ToString() पर कॉल किया जाता है।

तो की पहली छमाही के साथ संबंधित है कि:

मैं चाहता हूँ पता करने के लिए मैं क्यों ऊपर के उदाहरण में स्ट्रिंग में बदल जाती है, और नहीं वास्तव में एक संकलन त्रुटि

दूसरी छमाही दे है: कोई संकलन त्रुटि क्यों नहीं है?

संकलन त्रुटि क्यों होनी चाहिए? सी # विनिर्देश कहता है कि आप किसी ऑब्जेक्ट, या किसी भी ऑब्जेक्ट को किसी भी स्ट्रिंग में कोई स्ट्रिंग जोड़ सकते हैं। एक int एक वस्तु है, और इसलिए आप इसे एक स्ट्रिंग में जोड़ सकते हैं।

+0

मुझे आपका जवाब पसंद है। लेकिन मुझे अंतिम भाग के बारे में निश्चित नहीं है: यदि spec से आपका मतलब है कि + ऑपरेटर को @brokenglass के तरीके से परिभाषित किया गया है, तो मैं सहमत हूं ... – deostroll