引用类型和值类型的数组是对象数组的无效参数。

3
我需要调用以下函数:
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;
}

当我使用字符串数组(引用类型)调用GetValueOrDefault时,它可以正常工作:
GetValueOrDefault(new[] {"foo", "bar"}, 0);

当我使用int(ValueType)数组调用GetValueOrDefault时,它不起作用:
GetValueOrDefault(new[] {1, 2}, 0);

编译器错误为:

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

所以我的问题是:为什么这不像引用类型和值类型都派生自object一样编译?
我知道我可以使用泛型来解决这个问题,但我想了解这个错误。
static string GetValueOrDefault<T>(T[] values, int index)
{...}

提前感谢


1
GetValueOrDefault(new object[] { 1, 2 }, 0); - paul
1个回答

6
引用类型的数组是协变的,这意味着:可以将 string[] 视为 object[](虽然需要注意的是,如果尝试放入非字符串的值,它将会 throw)。但是,值类型的数组不是协变的,因此 int[] 不能 被视为 object[]new[] {1,2} 是一个 int[]
我记得这主要是为了与 Java 相似。在 .NET 4.0 中,协变性更加整洁。

非常有趣,我不知道那是这种情况。 - Levi Botelho
2
谢谢你的答案,我刚刚发现了Eric的一篇文章,讲述了这个问题:http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx - AlexH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接