将接口数组强制转换为结构数组时无效的隐式强制转换

本文关键字:转换 数组 无效 接口 结构 | 更新日期: 2023-09-27 18:17:19

我有一个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"。structimimplementation []' to 'MainNS。IStructInterface [] '

如果我将StructImplementation更改为class,我没有问题,所以我假设我要做的是无效的;或者我是盲目的,错过了一些明显的东西。

如有任何建议或解释,我将不胜感激。

编辑

如果其他人有这个问题,并且使用不同的方法不太理想(就像我的情况一样),我使用LINQ方法Cast<T>()来解决我的问题。因此,在上面的例子中,我将使用如下命令执行强制转换:

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

MSDN上有一篇关于泛型类型变异的好文章,我觉得非常有用。

将接口数组强制转换为结构数组时无效的隐式强制转换

数组方差只允许引用保留的情况,因此只适用于类。它本质上是将原始数据视为对不同类型的引用。

您在这里使用的协方差不支持结构体,因为它们是值类型而不是引用类型。