2

为什么

var value = new Guid[]{};
var b = (object[])value;

结果是

Cannot cast 'value' (which has an actual type of 'System.Guid[]') to 'object[]'

?

更新

对不起,不准确。真正的代码是:

    private void SetEditors(object value)
    {
        var array = value as object[];
        ...
    }

如果值为 Guid 数组,则数组为空。

4

3 回答 3

5
var b = value.Cast<object>().ToArray();
于 2012-11-27T14:38:49.270 回答
2

要回答“为什么”,只有部分引用类型的数组是协变的。

所以你可以写:

string[] x = new string[10];
object[] y = x;

但是你不能写:

int[] x = new int[10];
object[] y = x;

就我个人而言,我认为即使是第一个版本也被允许是一种耻辱,但这是一个不同的故事。

这在 C# 4 规范(隐式引用转换)的第 6.1.6 节中有详细说明:

隐式引用转换是:

  • ...
  • 从具有元素类型 S E的数组类型 S 到具有元素类型 T E的数组类型 T ,只要满足以下所有条件:
    • S 和 T 仅在元素类型上有所不同。换句话说,S 和 T 具有相同的维数。
    • S E和 T E都是引用类型。
    • 从 S E到 T E存在隐式引用转换
于 2012-11-27T14:42:23.027 回答
1

GUIDis object,但GUID[]is not object[],您必须向上转换数组中的每个元素

于 2012-11-27T14:38:51.923 回答