In einem Kommentar einer meiner Blogeinträge kam die Frage auf, ob man nicht eine Extension Method für das ‘??’-Konstrukt machen kann. Da habe ich mir die Frage gestellt, ob das überhaupt geht. Denn letztlich würde ja eine Methode auf einem Null-Objekt aufgerufen. Hier ein bißchen Code um den Sachverhalt zu verdeutlichen.
public class Program
{
static void Main(string[] args)
{
// NULL-String deklarieren
string str = null;
// Funktioniert NICHT, da es eine Klassenmethode ist
var bar = str.Contains("elo");
// Funktioniert, da es eine Extension Method ist
var foo = str.IfIsNull("Hello");
// Funktioniert auch! isFoo == "foo"
var isFoo = ((string)null).IfIsNull("foo");
}
}
internal static class StingExtension
{
public static string IfIsNull(this string hello, string alternateText)
{
if (hello == null) return alternate;
return hello;
}
}
Aber warum funktioniert das? Weder erscheint eine Compiler Fehlermeldung, noch der ReSharper jammert und zur Laufzeit wird auch keine Exception geworfen. Der Grund liegt in der Übersetzung von Extension Methods durch den Compiler. Eine Extension Method erscheint zwar als Klassenmethode, wird aber durch den statischen Aufruf der Methode ersetzt. Und eine statischer Methodenaufruf ist für Null-Objekte möglich und die Prüfung innerhalb der Methode verhindert die Exception. Damit wirft der Aufruf einer Extension Method auf “Null”-Objekte keine NullReferenceException. Klingt komisch, ist aber so.
