Var в классе дает ошибку
Возможный дубликат:
Использование var вне метода
class A {
string X;
}
// Proper
class A {
var X;
}
// Improper (gives error)
Почему это, что я не могу иметь переменную типа var объявить в классе и что можно сделать для ее достижения ИЛИ что является альтернативой?
В функции/методе я могу объявить переменную типа var, тогда почему не могу, я делаю это в классе?
Спасибо.
Ответы
Ответ 1
// method variable
var X;
никогда действителен - даже внутри метода; вам нужна немедленная инициализация для вывода типа:
// method variable
var X = "abc"; // now a string
Что касается того, почему это не доступно для полей с инициализатором поля: просто это говорит спецификатор. Теперь почему спецификация говорит, что это еще одна дискуссия... Я могу проверить аннотированную спецификацию но мое подозрение было бы просто потому, что они более необходимы для переменных метода, где логика более сложна (re LINQ и т.д.). Кроме того, они часто используются с анонимными типами (это необходимость для их существования); но анонимные типы не могут быть раскрыты в общедоступном api... так что вы могли бы смутить:
private var foo = new { x = 123, y = "abc"}; // valid
public var bar = new { x = 123, y = "abc"}; // invalid
Итак, в целом я доволен текущей логикой.
Ответ 2
Если вы действительно не знаете тип объекта, который будет храниться в вашей переменной экземпляра, используйте object
, not var
. var
не означает "я не знаю", это означает "вывести тип для меня" - поэтому он никогда не может использоваться для членов класса.
Ответ 3
Потому что С# не поддерживает этот уровень вывода типов. Ваши альтернативы должны использовать язык, такой как F #, который поддерживает этот тип вывода типа или попросит команду С# реализовать эту функцию. У меня есть довольно хорошее предположение, в котором вам больше повезет...
Ответ 4
var в С# - это неявно типизированная локальная переменная, используемая для вывода типа из RHS данного выражения, которое должно быть разрешено во время компиляции. Когда вы объявляете var без значения RHS в определении класса, компилятор не может знать тип, который вы пытаетесь назначить var.
С# не поддерживает неявное типирование для переменных класса.
Ответ 5
Поскольку фактический тип var выводится из контекста, в котором он используется. Для полей (переменных-членов класса) такого контекста нет.
Ответ 6
Вы можете утверждать, что намерение совершенно очевидно, если вы напишете var _users = new List<User>()
как объявление поля.
Проблема заключается в том, что не все объявления полей содержат назначение, необходимое для вывода типа. (Возможно, вы захотите инициализировать поле через конструктор)
Смешивание как var
, так и деклараций нормального типа выглядело бы как неприятный суп. Поэтому это невозможно.
(по крайней мере, моя догадка)
Ответ 7
Да, ключевое слово var
разрешено только для локальных переменных.
На языке было введено средство обработки анонимного типа, которое существует только в локальной области. Поскольку анонимный тип ограничен локальной областью, имеет смысл только разрешить ключевое слово var
в локальной области.
Кроме того, никогда не работает использование ключевого слова var
без указания значения, поскольку это используется для вывода типа данных:
var x = "asdf"; // works
var x; // doesn't work
Обычным способом объявления переменной является использование определенного типа данных. Используйте ключевое слово var
, если вы не можете указать тип данных (например, когда тип анонимный) или когда тип является сверхплотным (например, буквально повторяется в значении). Пример:
var x = new { Key = 42, Name = "asdf" };
var y = new System.Text.StringBuilder();
Ответ 8
Это все из-за порядка сборки. Вы можете объявить var только в методах. Компилятор сначала создает все, кроме методов, и поэтому тип объекта будет ясен для компилятора, если вы используете его внутри метода. У Джона был отличный ответ об этом, но он не может найти.