Подтвердить что ты не робот

Var в классе дает ошибку

Возможный дубликат:
Использование var вне метода

class A {
string X;
}
// Proper
class A {
var X;
}
// Improper (gives error)

Почему это, что я не могу иметь переменную типа var объявить в классе и что можно сделать для ее достижения ИЛИ что является альтернативой?

В функции/методе я могу объявить переменную типа var, тогда почему не могу, я делаю это в классе?

Спасибо.

4b9b3361

Ответ 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 только в методах. Компилятор сначала создает все, кроме методов, и поэтому тип объекта будет ясен для компилятора, если вы используете его внутри метода. У Джона был отличный ответ об этом, но он не может найти.