2015-12-30 21 views
5

Metody wywoływania z operatorem . są zawsze wywoływane, nawet jeśli obiekt jest pusty bez rzucania NullReferenceException. Korzystając z operatora ?., nigdy go nie wywoła. Na przykład:Operator? i metody rozszerzeń

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     A a = null; 
     a.b(); // works 
     a?.b(); // doesn't work 
    } 
} 

public class A { } 

public static class ext 
{ 
    public static void b(this A a) 
    { 
     Console.WriteLine("I'm called"); 
    } 
} 

Dlaczego metoda rozszerzenia nie jest w tym przypadku nazywana? Czy to jest funkcja ambiguos?

+2

Widać skompilowany kod> dekompilowana w [Spróbuj Roslyn] (http://tryroslyn.azurewebsites.net/#f:r/K4Zwlgdg5gBAygTxAFwKYFsDcAobAHYAIwBswBjGM4gQxBBgAUAnAeyievWwG9sZ+YBEuRgpqyEQDcWYACYwAstUgAKAJR8BvATpgBBGNRgBeGBGDFiOXQOoA6QuswwA9C5gB3FkwDWITTbUAPwOTq7usiyoIBAA5Mie3j4BMAC+2On4RKQUVLT0BtxpuEI5osjiInl0MKgAHsg8KaUiYhIU0nIwjsgAFmAFhho62jYwAMIsECAsxKh2AOpMYGgAMpCoKgBEAJKx6JTUlqiyW2rWAumpQAAA) – Kobi

+3

Dobrze '? .' operator sprawdza czy wartość jest' null' * przed * robieniem czegokolwiek, więc dlaczego to powinno działać? Coś do przeczytania: http://stackoverflow.com/questions/847209/in-c-what-happens-when-you-all-an-extension-method-on-a-null-object i https: // msdn. microsoft.com/en-us/library/dn986595.aspx – Fabjan

+2

Jakie jest praktyczne zastosowanie metody rozszerzenia, która w ogóle nie korzysta z tego obiektu. –

Odpowiedz

15

Twoje wyrażenie a. .b(), które używa ?. operator przekłada się na równowartość:

if(a != null) 
{ 
    a.b(); 
} 

tak dlatego metoda nie zostanie wywołana.

Powiązane problemy