2015-12-30 59 views
5

擴展方法使用.運算符始終調用,即使對象爲空而不拋出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

嘛'?.'運營商檢查是否值是'在*做任何事之前,爲什麼它應該工作?東西閱讀: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(); 
} 

所以這就是爲什麼你的方法不會被調用。