Ну, как говорили другие, проблема заключается в типе. Таким образом, ответ - нет, C # не допускает этого, потому что это язык со строгой типизацией, и он имеет дело только с известными типами времени компиляции. Компилятор мог быть спроектирован так, чтобы выводить его как тип object
, но дизайнеры решили избежать дополнительной сложности (в C # null
нет типа).
Одна альтернатива -
var foo = new { }; //anonymous type
Снова обратите внимание, что вы инициализируете тип, известный во время компиляции, и в конце это не null
, а анонимный объект. Это всего на несколько строк короче new object()
. Вы можете переназначить анонимный тип только на foo
в этом одном случае, что может быть или не быть желательным .
Инициализация до null
с неизвестным типом невозможна.
Если вы не используете dynamic
.
dynamic foo = null;
//or
var foo = (dynamic)null; //overkill
Конечно, это довольно бесполезно, если только вы не хотите переназначить значения переменной foo
. Вы теряете поддержку intellisense также в Visual Studio.
Наконец, как уже отвечали другие, у вас может быть определенный тип, объявленный при помощи приведения;
var foo = (T)null;
Итак, ваши варианты:
//initializes to non-null; I like it; cant be reassigned a value of any type
var foo = new { };
//initializes to non-null; can be reassigned a value of any type
var foo = new object();
//initializes to null; dangerous and finds least use; can be reassigned a value of any type
dynamic foo = null;
var foo = (dynamic)null;
//initializes to null; more conventional; can be reassigned a value of any type
object foo = null;
//initializes to null; cannot be reassigned a value of any type
var foo = (T)null;