Почему я не могу сделать это с неявными типами в C #?

StackOverflow https://stackoverflow.com/questions/1570557

Вопрос

var x = new { a = "foobar", b = 42 };
List<x.GetType()> y;

Есть ли другой способ сделать то, что я хочу сделать здесь?

Если это не так, то я действительно не вижу особого смысла в неявных типах...

Это было полезно?

Решение

x.GetType() это вызов метода, оцениваемый во время выполнения.Следовательно, он не может быть использован для время компиляции понятие, подобное типу переменной.Я согласен, что иногда было бы весьма удобно иметь возможность делать что-то подобное (указывая тип переменной во время компиляции в качестве аргумента типа в другом месте), но в настоящее время вы не можете.Хотя я не могу сказать, что регулярно скучаю по этому.

Однако, вы может делай:

var x = new { a = "foobar", b = 42 };
var y = new[] { x };
var z = y.ToList();

Вы также могли бы написать простой метод расширения для создания списка в общем виде:

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}

(Выберите другое имя, если хотите :)

Тогда:

var x = new { a = "foobar", b = 42 };
var y = x.InList();

Как показывает Марк, на самом деле это вообще не обязательно должен быть метод расширения.Единственная важная вещь заключается в том, что компилятор может использовать вывод типа для определения параметра типа для метода, так что вам не придется пытаться присвоить имя анонимному типу.

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

Другие советы

Есть способы сделать это с помощью универсального метода:

public static List<T> CreateList<T>(T example) {
    return new List<T>();
}
...
var list = CreateList(x);

или путем создания списка с данные, а затем их удаление...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top