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;
}

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

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

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

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

编译器错误是:

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

所以我的问题是:为什么这不能编译为引用类型和值类型从对象派生

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

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

提前致谢

4

1 回答 1

6

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

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

于 2013-01-29T12:45:19.737 回答