यह वास्तव में this question का एक ऑफशूट है, लेकिन मुझे लगता है कि यह अपने स्वयं के उत्तर के योग्य है।एक उपयोग प्रकार को एक निर्दिष्ट कथन अपरिभाषित व्यवहार के भीतर से संशोधित कर रहा है?
स्थानीय चर एक संसाधन अधिग्रहण में घोषित पढ़ा रहे हैं:
ECMA-334 की धारा 15.13 के अनुसार (
using
बयान पर, नीचे के रूप में संसाधन अधिग्रहण कहा गया है) केवल, और एक प्रारंभकर्ता शामिल होगा। एक संकलन समय त्रुटि तब होती है, तो एम्बेडेड बयान प्रयास (काम के माध्यम से++
और--
ऑपरेटर या) इन स्थानीय चर को संशोधित करने या उन्हेंref
याout
पैरामीटर के रूप में पारित करने के लिए।
ऐसा लगता है कि नीचे दिया गया कोड अवैध क्यों है।
struct Mutable : IDisposable
{
public int Field;
public void SetField(int value) { Field = value; }
public void Dispose() { }
}
using (var m = new Mutable())
{
// This results in a compiler error.
m.Field = 10;
}
लेकिन इसके बारे में क्या?
using (var e = new Mutable())
{
// This is doing exactly the same thing, but it compiles and runs just fine.
e.SetField(10);
}
ऊपर टुकड़ा अपरिभाषित और/या सी # में अवैध है? यदि यह कानूनी है, तो इस कोड और उपरोक्त spec से उद्धरण के बीच संबंध क्या है? यदि यह अवैध है, तो यह क्यों काम करता है? क्या वहां कुछ सूक्ष्म छेड़छाड़ है जो इसे अनुमति देती है, या यह तथ्य है कि यह केवल भाग्य के लिए जिम्मेदार है (ताकि किसी को इस तरह के हानिकारक दिखने वाले कोड की कार्यक्षमता पर भरोसा नहीं करना चाहिए)?
असाइनमेंट का उपयोग कर एक विधि बुला रहा है? क्या यह '++ 'या' - ऑपरेटरों का उपयोग कर रहा है? क्या यह इसे 'रेफरी' या 'आउट' पैरामीटर के रूप में पास कर रहा है? –
@ आओन: यह मेरा प्रश्न है। एक मान प्रकार पर एक विधि को कॉल करना जो उस मान के राज्य को संशोधित करता है अनिवार्य रूप से असाइनमेंट से अलग नहीं है, है ना? यही कारण है कि एक क्षेत्र को संशोधित करना शायद ही सीमित है? –
आप इस सामान के साथ कहां आते हैं? उल्लेखनीय है कि एक संपत्ति या तो काम नहीं करता है। जो कि एक कारण होने से रिमोटिंग को रोकता है, हुड के नीचे सिर्फ एक विधि कॉल है। वैसे भी लाया। यह बग की तरह quacks। खैर, दोष। एरिक लिपर्ट के नाम का उल्लेख आमतौर पर उन्हें एक यात्रा का भुगतान करने के लिए मिलता है। किया हुआ। –