У меня есть 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 есть хорошая статья о Дисперсия в универсальных типах , которая мне показалась очень полезной.