Неверное неявное приведение при приведении массива интерфейсов к массиву структур - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть 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 ]

2 голосов
/ 08 декабря 2011

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

1 голос
/ 08 декабря 2011

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

...