Ответ 1
public static List<T> CreateCompatibleList<T> (T t)
{
return new List<T> () ;
}
var x = 10 ;
var l = CreateCompatibleList (x) ;
Я не думаю, что это можно сделать на С#, но публиковать это просто, чтобы убедиться. Вот моя проблема. Я хотел бы сделать что-то вроде этого на С#:
var x = 10;
var l = new List<typeof(x)>();
или
var x = 10;
var t = typeof(x);
var l = new List<t>();
Но, конечно, это не сработает. Хотя это не должно быть проблемой, так как тип t разрешается во время компиляции. Я понимаю, что это можно решить с помощью отражения, но поскольку типы известны во время компиляции с использованием отражения, будет излишним.
public static List<T> CreateCompatibleList<T> (T t)
{
return new List<T> () ;
}
var x = 10 ;
var l = CreateCompatibleList (x) ;
Вы пытаетесь получить .Net, чтобы установить общий тип, используя оператор времени выполнения. Как вы знаете, это не сработает. Типы обобщений должны быть установлены во время компиляции.
Определение дженериков выполняется так же, как в С#:
var someList = new List<int>();
Вы можете не определять такие файлы:
var x = 1;
var someType = typeof(x);
var someList = new List<someType>();
потому что в этом случае вы указываете тип во время выполнения, а не время компиляции. С# не поддерживает это.
Вы не можете сделать это именно так, как вы просите, но с небольшим отражением вы можете сделать то же самое
Type genericType = typeof(List<>);
Type[] type = new Type[] { typeof(int) };
Type instanceType = genericType.MakeGenericType(type);
object instance = Activator.CreateInstance(instanceType );
var l = (List<int>)instance;