Почему мы не можем объявить var a = new List<string> на уровне класса?
Я знаю, что мы не можем сделать это на уровне класса, но на уровне метода мы всегда можем сделать это.
var myList=new List<string> // or something else like this
Этот вопрос пришел мне в голову, так как везде, где мы объявляем переменную, как это. Мы всегда предоставляем информацию о типе в RHS выражения. Поэтому компилятору не нужно угадывать типы. (поправьте меня, если я ошибаюсь).
поэтому вопрос остается ПОЧЕМУ НЕ на уровне класса, в то время как его разрешено на уровне метода
5 ответов
Есть технические проблемы с реализацией этой функции. Общие случаи кажутся простыми, но более сложные случаи (например, поля, ссылающиеся на другие поля в цепочках или циклах, выражения, которые содержат анонимные типы), не являются таковыми.
См. Блог Эрика Липперта для подробного объяснения: почему нет полей?
Ребята из компилятора просто не реализовали поддержку.
Это полностью волшебство компилятора, и компилятор на самом деле не помещает в IL что-то, что говорит: "выясни тип во время выполнения", он знает тип и встраивает его, так что он мог бы сделать это и для членов.
Это просто не так.
Я почти уверен, что если вы спросите настоящего парня-компилятора в команде по компиляции C#, вы получите что-то официальное, но здесь не происходит никакой магии, и должно быть возможно сделать то же самое для полей членов.
var
ключевое слово было придумано специально для поддержки анонимных типов. Как правило, вы НЕ собираетесь объявлять анонимные типы на уровне класса, и, таким образом, это не было реализовано.
Ваш пример заявления
var myList=new List<string>
не очень хороший пример того, как использовать var
Ключевое слово, так как это не по назначению.
Это не так просто, как реализация var в методе, поскольку вам также необходимо учитывать различные модификаторы и атрибуты, например:
[MyAttribute()] protected internal readonly var list = new List<T>();
Что бы мне действительно понравилось, так это константный тип!
public const notFoundStatus = 404; // int
Тип пропуска в Generic
class Class1
{
public void genmethod<T>(T i,int Count)
{
List<string> list = i as List<string>;
for (int j = 0; j < Count; j++)
{
Console.WriteLine(list[j]);
}
}
static void Main(string[] args)
{
Class1 c = new Class1();
c.genmethod<string>("str",0);
List<string> l = new List<string>();
l.Add("a");
l.Add("b");
l.Add("c");
l.Add("d");
c.genmethod<List<string>>(l,l.Count);
Console.WriteLine("abc");
Console.ReadLine();
}
}