public interface IValidator
{
ValidatorType Type { get; }
}
public struct EqualValidator : IValidator
{
public string Left;
public string Right;
public ValidatorType Type { get; }
public EqualValidator(string left, string right) => (Left, Right, Type) = (left, right, ValidatorType.Equal);
}
public struct GeneratedAdaptiveItem
{
public IValidator[] Validators;
}
...
var secondi = new GeneratedAdaptiveItem()
{
Validators = new []// <- doesn't compile, compiler says "Cannot convert source type 'ApiTst.Runner.AnalyzeSystem.EqualValidator[]' to target type 'ApiTst.Runner.AnalyzeSystem.IValidator[]'"
{
new EqualValidator(
$"{fi.OutInfo.OutVariableName}.{fi.InInfoClass.Props[0]}",
$"apiCustomerGETAsync.{fi.InInfoClass.Props[0]}"
)
}
};
Это исправляется, вот так:
Validators = new IValidator[] <- explicit specify the type
{
new EqualValidator(
$"{fi.OutInfo.OutVariableName}.{fi.InInfoClass.Props[0]}",
$"apiCustomerGETAsync.{fi.InInfoClass.Props[0]}"
)
}
А вот если сделать EqualValidator классом, а не структурой, то ошибки не будет.
Все дело в том, что если EqualValidator структура, при явном ограничении типа массива интерфейсом она будет упакована, и в данном случае компилятор хочет, чтобы разработчик сам принял решение упаковать структуру.
Еще один пример:
Меняем на класс:
Resharper предупреждает, что ковариантность массива, способствует ошибке при записи, ведь на самом деле тип массива остался A, и если попробовать вставить другой класс реализующий IA
, будет ошибка:
Вот так все окей: