2015-12-30 14 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"); 
    } 
} 

この場合、拡張メソッドが呼び出されないのはなぜですか?これはあいまいな機能ですか?

+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

あなたの式は ?を使用していますか?オペレータは同等に変換します。

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

あなたのメソッドが呼び出されません。なぜこれがあります。

関連する問題