string a = null; object b = null; Button c = null;
Aber:
var d = null; //das geht nicht c = a; //geht offensichtlich auch nicht
Die Frage ist jetzt, welchen Typ null hat. Merkwüdig ist auch, dass obwohl a und c beide null sind, man a nicht nach c zuweisen kann. Also scheint null manchmal einen Typ zu haben und manchmal nicht.
The type of a null-literal is the null type (§11.2.7).
§11.2.7:
The null literal (§9.4.4.6) evaluates to the null value, which is used to denote a reference not pointing at any object or array, or the absence of a value. The null type has a single value, which is the null value. Hence an expression whose type is the null type can evaluate only to the null value. There is no way to explicitly write the null type and, therefore, no way to use it in a declared type.
Moreover, the null type can never be the type inferred for a type parameter (§25.6.4).
Hier ist noch ein netter Link dazu (s. meine Kommentar vom 08.09.2009 und Erics Antwort.) http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx
Null ist kein Typ sondern "nichts". Die Zuweisungen funktionieren nicht da zB ein Objekt vom Typ Button nicht einem Objekt vom Typ String zugewiesen werden kann (dies prüft der Compiler). Auf IL-Ebene wäre das aber möglich (macht aber keinen Sinn und wird deshalb vom Compiler als Fehler indiziert).
var d = null funktioniert nicht weil der Compiler den Typ für d nicht ableiten kann (null ist eben nichts und hat keinen Typ).
Nur weil das in PHP geht, geht das in C# noch lange nicht. Das sind zwei konzeptionell stark unterschiedliche Sprachen.
Mit GetType kann man den Typen nicht ermitteln: Das null-Literal wird zum Wert null ausgewertet. Wenn man demnach GetType aufrufen wollte, würde das zu einer zu einer NullReferenceException zur Laufzeit führen. Überhaupt ist mit dem der null-Type in C# kein CLR Typ assoziiert.
Ach, was Du nicht sagst. PHP != C# ??? hätte ich ja nie für möglich gehalten. Ich habe ja auch geschrieben, daß ich schätze, daß es eventuell so gehen könnte, weil es in einigen anderen Sprachen (habe mal PHP herausgepickt) einen TYP NULL gibt, der als einzigen Wert das Literal NULL zulässt. In C++ ist NULL ein Zeiger ins Nirvana (in Delphi übrigens auch) und ist vom Typ einfach ein Zeiger. Aber auch das ist ja kein Indiz für C#, wei lauch diese Sprachen "anders" sind. Habe mir jetzt ein C#-Buch unters Kopfkissen gelegt um in Zukunft "fundierter" zu antworten zu können.
http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx