मैं एक लम्बा अभिव्यक्ति का उपयोग करने के लिए देख रहा था ताकि घटनाओं को मजबूती से टाइप किया जा सके, लेकिन मध्य में श्रोता के साथ, उदाहरण के लिए निम्नलिखित वर्गोंलैम्बडा एक्सप्रेशन में घटनाक्रम - सी # कंपाइलर बग?
class Producer
{
public event EventHandler MyEvent;
}
class Consumer
{
public void MyHandler(object sender, EventArgs e) { /* ... */ }
}
class Listener
{
public static void WireUp<TProducer, TConsumer>(
Expression<Action<TProducer, TConsumer>> expr) { /* ... */ }
}
एक घटना के रूप में तार हो जाएगा दिया:
Listener.WireUp<Producer, Consumer>((p, c) => p.MyEvent += c.MyHandler);
हालांकि यह एक संकलक त्रुटि देता है:
CS0832: An expression tree may not contain an assignment operator
अब पहली बार इस उचित लगता है पर, विशेष रूप से reading the explanation about why expression trees cannot contain assignments के बाद । हालांकि, सी # वाक्य रचना के बावजूद, +=
नहीं एक काम, है यह, Producer::add_MyEvent
विधि के लिए एक कॉल है के रूप में हम कोल इंडिया उत्पादन किया है कि से देख सकते हैं, तो हम सिर्फ घटना ऊपर तार सामान्य रूप से:
L_0001: newobj instance void LambdaEvents.Producer::.ctor()
L_0007: newobj instance void LambdaEvents.Consumer::.ctor()
L_000f: ldftn instance void LambdaEvents.Consumer::MyHandler(object, class [mscorlib]System.EventArgs)
L_0015: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
L_001a: callvirt instance void LambdaEvents.Producer::add_MyEvent(class [mscorlib]System.EventHandler)
तो ऐसा लगता है कि यह एक कंपाइलर बग है क्योंकि यह असाइनमेंट की अनुमति नहीं दे रहा है, लेकिन कोई असाइनमेंट नहीं है, बस एक विधि कॉल है। या क्या मैं कुछ न कुछ भूल रहा हूं...?
संपादित करें:
कृपया ध्यान दें कि सवाल यह है कि "इस व्यवहार एक संकलक बग है?"। क्षमा करें अगर मैं जो पूछ रहा था उसके बारे में स्पष्ट नहीं था।
संपादित 2
Inferis 'जवाब, जहां वे कहते हैं पढ़ने के बाद "उस बिंदु पर + = काम माना जाता है" यह कुछ मतलब होता है, क्योंकि इस समय तक संकलक यकीनन नहीं है पता है कि यह सीआईएल में बदल जाएगा।
हालांकि मैं स्पष्ट विधि कॉल प्रपत्र लिखने के लिए अनुमति नहीं कर रहा हूँ:
Listener.WireUp<Producer, Consumer>(
(p, c) => p.add_MyEvent(new EventHandler(c.MyHandler)));
देता है:
CS0571: 'Producer.MyEvent.add': cannot explicitly call operator or accessor
तो, मुझे लगता है कि प्रश्न के नीचे आता है क्या +=
वास्तव में के संदर्भ में इसका मतलब है सी # घटनाओं। इसका मतलब है "इस घटना के लिए ऐड विधि को कॉल करें" या इसका मतलब यह है कि "इस घटना में अभी तक अनिर्धारित तरीके से जोड़ें"। यदि यह पूर्व है तो यह मुझे एक कंपाइलर बग होने लगता है, जबकि यदि यह बाद वाला है तो यह कुछ हद तक अनजान है लेकिन तर्कसंगत रूप से एक बग नहीं है। विचार?
+ = का अर्थ है "दिए गए ईवेंट के लिए ईवेंट एक्सेसर को कॉल करें"। मुझे लगता है कि यह एक बग नहीं है, लेकिन थोड़ा कष्टप्रद और तर्कसंगत अनावश्यक प्रतिबंध है। –