ReferenceType 和 ValueType 的数组是对象数组的无效参数
本文关键字:数组 无效 参数 对象 ReferenceType ValueType | 更新日期: 2023-09-27 17:56:42
我需要调用以下函数:
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)
{...}
提前致谢
引用类型的数组是协变的,这意味着:string[]
可以被视为object[]
(尽管问题是如果你尝试放入非字符串,它会throw
)。但是,值类型的数组不是协变的,因此不能将int[]
视为object[]
。 new[] {1,2}
是一个int[]
.
IIRC这样做主要是为了与Java相似。.NET 4.0 中的协方差要整洁得多。