2015-10-23 9 views
8

पृष्ठभूमि: C# : The New and Improved C# 6.0घटनाओं के लिए शून्य-प्रचार क्यों काम नहीं करता है?

using System; 

internal sealed class Program 
{ 
    private sealed class Inner 
    { 
     internal int Value { get; } = 42; 
     internal void DoSomething(int value) { } 
     internal event EventHandler Event; 
    } 

    private sealed class Outer 
    { 
     internal Inner Inner { get; } = new Inner(); 
    } 

    private static void Main(string[] args) 
    { 
     Outer outer = null; 

     // Works as expected (does not call Inner and Value, val is null) 
     int? val = outer?.Inner.Value; 

     // Works as expected (does not call Inner and DoSomething) 
     outer?.Inner.DoSomething(42); 

     // CS0070: The event 'Program.Inner.Event' can only appear on the left hand 
     // side of += or -= (except when used from within the type 'Program.Inner') 
     outer?.Inner.Event += (s, e) => { }; 
    } 
} 

के बाद से += ऑपरेटर घटना के ऐड विधि फोन करने के लिए बस वाक्यात्मक चीनी है, मैं उम्मीद है कि अंतिम पंक्ति सिर्फ DoSomething() करने के लिए कॉल की तरह संकलित (और यह नहीं करता है कि ' रनटाइम पर कुछ भी नहीं करते हैं)।

+2

यदि यह अनुमति दी गई थी और 'बाहरी' शून्य था तो आप क्या होने की उम्मीद करेंगे? – DavidG

+0

@DavidG कोष्ठक में टिप्पणी देखें, इसे कुछ भी नहीं करना चाहिए, बस कॉल करने के लिए कॉल करें() –

+3

लेकिन आप यह भी देखेंगे कि आप 'बाहरी नहीं कर सकते हैं? अंदरूनी। वैल्यू = 42;' – DavidG

उत्तर

5

+= ऑपरेटर वास्तव में एक विधि कॉल के लिए वाक्य रचनात्मक चीनी है, लेकिन यह एक ऑपरेटर है, विधि विधि नहीं है।

+= ऑपरेटर के बाएं हाथ की ओर कोड है:

outer?.Inner.Event 

कोड है कि ऑपरेटर के बाएं हाथ की ओर कुछ है कि को सौंपा जा सकता करने के लिए मूल्यांकन करने के लिए की जरूरत है और एक + ऑपरेटर पर परिभाषित किया गया है यह (उदाहरण के लिए प्रतिनिधि प्रकार का एक चर), या एक घटना।

यह कोड outer == null पर किसी ईवेंट का मूल्यांकन नहीं कर सकता है, यही कारण है कि यह अवैध है।

संबंधित मुद्दे