Как инициализировать var? - PullRequest
52 голосов
/ 25 мая 2010

Могу ли я инициализировать переменную с нулевым или каким-либо пустым значением?

Ответы [ 11 ]

50 голосов
/ 25 мая 2010

C # является строго / строго типизированным языком . var был введен для привязки типов во время компиляции для анонимных типов , но вы можете использовать var для примитивных и пользовательских типов, которые уже известны во время разработки. Во время выполнения нет ничего похожего на var, он заменяется реальным типом, который является либо ссылочным типом, либо типом значения.

Когда вы говорите,

var x = null; 

компилятор не может решить эту проблему, потому что нет типа, привязанного к null. Вы можете сделать это так.

string y = null;
var x = y;

Это будет работать, потому что теперь x может знать свой тип во время компиляции, который в данном случае является строкой.

30 голосов
/ 16 января 2014

Ну, как говорили другие, проблема заключается в типе. Таким образом, ответ - нет, 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;
30 голосов
/ 25 мая 2010

Почему это невозможно?

var theNameOfTheVar = (TheType)null;

например:

var name = (string)null;

Просто так.

16 голосов
/ 09 августа 2016

Это способ инициализировать значение до переменная var

var _myVal = (dynamic)null; 
7 голосов
/ 25 мая 2010

A var нельзя установить на null, так как он должен быть статически набран.

var foo = null;
// compiler goes: "Huh, what's that type of foo?"

Тем не менее, вы можете использовать эту конструкцию, чтобы обойти проблему:

var foo = (string)null;
// compiler goes: "Ah, it's a string. Nice."

Не знаю точно, но из того, что я слышал, вы также можете использовать dynamic вместо var. Это не требует статической типизации.

dynamic foo = null;
foo = "hi";

Кроме того, поскольку из вопроса мне было непонятно, имели ли вы в виду ключевое слово или переменные var в целом: только ссылки (на классы) и типы, допускающие значения NULL, могут быть установлены в null. Например, вы можете сделать это:

string s = null; // reference
SomeClass c = null; // reference
int? i = null; // nullable

Но вы не можете сделать это:

int i = null; // integers cannot contain null
4 голосов
/ 11 ноября 2013

Ну, я думаю, вы можете назначить его новому объекту. Что-то вроде:

var v = new object();
3 голосов
/ 25 мая 2010

var просто говорит компилятору выводить тип, который вы хотели во время компиляции ... он не может выводить из null (хотя бывают случаи, когда может ).

Итак, нет, вам не разрешено это делать.

Когда вы говорите «какое-то пустое значение» ... если вы имеете в виду:

var s = string.Empty;
//
var s = "";

Тогда да, вы можете сделать это, но не null.

3 голосов
/ 25 мая 2010

Неа. var необходимо инициализировать для типа, оно не может быть нулевым.

2 голосов
/ 25 мая 2010

Вы не можете присвоить null типу var.

Если вы присваиваете значение null, компилятор не может найти нужную переменную в var place.

выдает ошибку: Cannot assign <null> to an implicitly-typed local variable

Вы можете попробовать это:

var dummy =(string)null;

Здесь компилятор может найти нужный тип, так что нет проблем

Вы можете присвоить несколько пустых значений.

var dummy = string.Empty;

или

var dummy = 0;
0 голосов
/ 06 августа 2014

Спасибо, Mr.Snake, нашел эту полезную информацию для другого трюка, который я искал :) (Недостаточно повторений, чтобы комментировать)

Сокращенное присвоение допускаемых типов. Как это:

var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
                    ? Convert.ToDateTime(dataRow["SomeDate"])
                    : (DateTime?) null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...