Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save eterekhin/03be2566313b1e0471ef40f2e16d2dfc to your computer and use it in GitHub Desktop.
Save eterekhin/03be2566313b1e0471ef40f2e16d2dfc to your computer and use it in GitHub Desktop.
    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, будет ошибка:

Вот так все окей:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment