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?
Widać skompilowany kod> dekompilowana w [Spróbuj Roslyn] (http://tryroslyn.azurewebsites.net/#f:r/K4Zwlgdg5gBAygTxAFwKYFsDcAobAHYAIwBswBjGM4gQxBBgAUAnAeyievWwG9sZ+YBEuRgpqyEQDcWYACYwAstUgAKAJR8BvATpgBBGNRgBeGBGDFiOXQOoA6QuswwA9C5gB3FkwDWITTbUAPwOTq7usiyoIBAA5Mie3j4BMAC+2On4RKQUVLT0BtxpuEI5osjiInl0MKgAHsg8KaUiYhIU0nIwjsgAFmAFhho62jYwAMIsECAsxKh2AOpMYGgAMpCoKgBEAJKx6JTUlqiyW2rWAumpQAAA) – Kobi
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
Jakie jest praktyczne zastosowanie metody rozszerzenia, która w ogóle nie korzysta z tego obiektu. –