Неверное неявное приведение при приведении массива интерфейсов к массиву структур
У меня есть 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 учитывает регистр сохранения ссылок и поэтому работает только для классов. По сути, он рассматривает исходные данные как ссылку на другой тип. Это просто невозможно с помощью структур.
Конвариантность, которую вы здесь используете, не поддерживается для структур, поскольку они являются типами значений, а не ссылочными типами. Смотрите здесь для получения дополнительной информации.