Неверное неявное приведение при приведении массива интерфейсов к массиву структур

У меня есть struct который реализует некоторые interface, Это работает нормально, пока у меня нет массива struct реализация и попытаться неявно привести этот массив к другому массиву interface тип. (См. Пример кода ниже)

using System.Collections.Generic;

namespace MainNS
{
    public interface IStructInterface
    {
        string Name { get; }
    }

    public struct StructImplementation : IStructInterface
    {
        public string Name
        {
            get { return "Test"; }
        }
    }

    public class MainClass
    {
        public static void Main()
        {
            StructImplementation[] structCollection = new StructImplementation[1]
            {
                new StructImplementation()
            };

            // Perform an implicit cast
            IEnumerable<IStructInterface> castCollection = structCollection;    // Invalid implicit cast
        }
    }
}

При компиляции приведенного выше кода я получаю ошибку:

ошибка CS0029: невозможно неявное преобразование типа 'MainNS.StructImplementation[]' в 'MainNS.IStructInterface[]'

Если я изменю StructImplementation к class У меня нет проблем, поэтому я предполагаю, что то, что я пытаюсь сделать, либо неверно; или я слепой и упускаю что-то очевидное.

Любой совет или объяснение этого будет оценено.

РЕДАКТИРОВАТЬ

В случае, если у кого-то еще есть эта проблема, и использование другого подхода не является идеальным (как это было в моей ситуации), я решил эту проблему, используя метод LINQ. Cast<T>(), Таким образом, в приведенном выше примере я выполняю приведение, используя что-то вроде:

IEnumerable<IStructInterface> castCollection = structCollection.Cast<IStructInterface>();

На MSDN есть хорошая статья о дисперсии в универсальных типах, которая мне показалась очень полезной.

2 ответа

Решение

Дисперсия массива ony учитывает регистр сохранения ссылок и поэтому работает только для классов. По сути, он рассматривает исходные данные как ссылку на другой тип. Это просто невозможно с помощью структур.

Конвариантность, которую вы здесь используете, не поддерживается для структур, поскольку они являются типами значений, а не ссылочными типами. Смотрите здесь для получения дополнительной информации.

Другие вопросы по тегам