ReferenceType和ValueType的数组是对象数组的无效参数

时间:2013-01-29 12:42:42

标签: c# arrays

我需要调用以下函数:

static string GetValueOrDefault(object[] values, int index)
{
    if (values == null)
         return string.Empty;
    if (index >= values.Length)
         return string.Empty;
    return values[index] != null ? values[index].ToString() : string.Empty;
}

当我用一个字符串数组(ReferenceType)调用GetValueOrDefault时,它可以工作:

GetValueOrDefault(new[] {"foo", "bar"}, 0);

当我使用int(ValueType)数组调用GetValueOrDefault时,它不起作用:

GetValueOrDefault(new[] {1, 2}, 0);

编译错误是:

  

最佳重载方法匹配   MyNamespace.GetValueOrDefault(object [],int)'有一些无效   参数

所以我的问题是:为什么这不编译为reference types and value type derive from object

我知道我可以使用泛型来解决这个问题,但我想了解这个错误

static string GetValueOrDefault<T>(T[] values, int index)
{...}

提前致谢

1 个答案:

答案 0 :(得分:6)

引用类型的数组是协变的,这意味着:string[]可以被视为object[](尽管问题在于,如果你尝试将非字符串放入其中,它将会throw 1}})。但是,值类型数组协变,因此int[] 不能 被视为object[]new[] {1,2}int[]

IIRC这主要是为了与java相似。 .NET 4.0中的协方差更加整洁。