Это не ошибка компилятора. Сначала нужно инициализировать структуру, как говорит компилятор. Предположительно ваша ошибка на самом деле в коде, который вызывает делегат, поскольку больше ничего не имеет смысла.
Когда вы вызывали делегата с вашей двойной версией из 16 параметров, двойные параметры были инициализированы. Если бы вы не инициализировали их, компилятор выдал бы ту же ошибку. Например:
private static void actDouble(double d)
{
}
static void Main(string[] args)
{
double d;
Action<double> act = actDouble;
act(d);//error on this line
}
Это не компилируется со следующей ошибкой:
error CS0165: Use of unassigned local variable 'd'
Нет ничего особенного в структурах в этом отношении.
Как правило, ваша первая догадка, когда вы сталкиваетесь с синтаксической ошибкой, никогда не должна заключаться в том, что это ошибка компилятора. Ошибки компилятора чрезвычайно редки, особенно в столь широко используемом компиляторе, как этот.
Обновление после редактирования вопроса, в котором добавлен реальный код
Test test;
int b = 0;
if (b == 4)
{
test.a = 5;
}
OnBlah(test);
Компилятор не уверен, что test
полностью инициализирован. Это не делает анализ потока программы. Вы можете решить проблему, убедившись, что компилятор знает, что структура полностью инициализирована.