C#中的隐式数组转换

Mal*_*lki 4 c# arrays operator-overloading implicit-cast

我有以下类定义了隐式转换运算符:

class A
{
    ...
}
class B
{
    private A m_a;

    public B(A a)
    {
        this.m_a = a;
    }

    public static implicit operator B(A a)
    {
        return new B(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以隐含地将A转换为B.

但为什么我不能隐含地将A []强制转换为B []?

static void Main(string[] args)
{
    // compiles
    A a = new A();
    B b = a;

    // doesn't compile
    A[] arrA = new A[] {new A(), new A()};
    B[] arrB = arrA;
}
Run Code Online (Sandbox Code Playgroud)

谢谢,Malki.

Ran*_*pho 9

正如Mehrdad Afshari提到的那样,你在运气方面做得不好.你必须明确,它将涉及一个数组副本.值得庆幸的是,您可以使用单行代码:

arrB = arrA.Cast<B>().ToArray();
Run Code Online (Sandbox Code Playgroud)

虽然如果您只想arrBforeach语句中进行迭代,可以通过省略来避免复制ToArray()


Meh*_*ari 5

数组协方差仅适用于引用类型和继承层次结构(请注意,它不是表示更改的转换:只是一组具有相同大小的指针解释不同.)它不适用于值类型和用户定义的转换.

  • @Randolpho:不对.自.NET 1.0以来,数组协方差已经存在.它不是静态检查*generics*的安全共同/反差,这是.NET 4中的新功能. (2认同)