2015-12-30 2 views
5

Методы расширения с оператором . всегда вызываются, даже если объект имеет значение null без метания NullReferenceException. Используя оператор ?., он никогда не будет звонить. Например:Оператор?. и методы расширения

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"); 
    } 
} 

Почему метод расширения не вызывается в этом случае? Является ли это особенностью ambiguos?

+2

Вы можете увидеть скомпилированный> декомпилированного кода на [Попробуйте Рослины] (http://tryroslyn.azurewebsites.net/#f:r/K4Zwlgdg5gBAygTxAFwKYFsDcAobAHYAIwBswBjGM4gQxBBgAUAnAeyievWwG9sZ+YBEuRgpqyEQDcWYACYwAstUgAKAJR8BvATpgBBGNRgBeGBGDFiOXQOoA6QuswwA9C5gB3FkwDWITTbUAPwOTq7usiyoIBAA5Mie3j4BMAC+2On4RKQUVLT0BtxpuEI5osjiInl0MKgAHsg8KaUiYhIU0nIwjsgAFmAFhho62jYwAMIsECAsxKh2AOpMYGgAMpCoKgBEAJKx6JTUlqiyW2rWAumpQAAA) – Kobi

+3

Ну '? .' оператор проверяет значение' null' * перед тем, как делать что-либо, так почему он должен работать? Что-то почитать: http://stackoverflow.com/questions/847209/in-c-what-happens-when-you-call-an-extension-method-on-a-null-object и https: // msdn. microsoft.com/en-us/library/dn986595.aspx – Fabjan

+2

Каково практическое использование метода расширения, который вообще не использует этот объект. –

ответ

15

Ваше выражение a? .b() которое использует ?. оператор переводит эквивалент:

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

так это то, почему ваш метод не дозвонились.