Ответ 1
Это потому, что вы используете Activator.CreateInstance
overload, который принимает массив объектов, который должен содержать список параметров конструктора. Другими словами, он пытается найти перегрузку конструктора StateLog
, которая имеет 16 параметров, а не одну. Это компилируется из-за ковариации массива.
Итак, когда компилятор видит это выражение:
Activator.CreateInstance(typeof(T), lines)
так как lines
является string[]
, он предполагает, что вы хотите полагаться на ковариацию, чтобы автоматически передать его на object[]
, что означает, что компилятор действительно видит это следующим образом:
Activator.CreateInstance(typeof(T), (object[])lines)
Затем метод попытается найти конструктор, который имеет ряд параметров, равных lines.Length
, всех типов string
.
Например, если у вас есть эти конструкторы:
class StateLog
{
public StateLog(string[] line) { ... }
public StateLog(string a, string b, string c) { ... }
}
Вызов Activator.CreateInstance(typeof(StateLog), new string[] { "a", "b", "c" })
вызовет второй конструктор (тот, у которого три параметра), а не первый.
На самом деле вы хотите передать массив целиком lines
в качестве первого элемента массива, эффективно:
var parameters = new object[1];
parameters[0] = lines;
Activator.CreateInstance(typeof(T), parameters)
Конечно, вы можете просто использовать инициализатор встроенного массива:
list.Add((T)Activator.CreateInstance(typeof(T), new object[] { lines }));