最近我在 C# 中发现了一个非常令人惊讶的行为。
我有一个方法需要IEnumerable<Object>
作为参数,我正在传递IEnumerable<string>
但这是不可能的。
虽然在 C# 中,所有内容都可以向上转型为 Object,但为什么这是不可能的?
这对我来说完全令人困惑。
请有人澄清我这个问题。
其技术术语是泛型在 C# 3.0 及更早版本中是不变的。从 C#4.0 开始,强制转换就起作用了。
不变性的意思是两个泛型类型之间不存在任何关系,仅仅因为它们的泛型类型参数是相关的(即彼此是子类型或超类型)。
在您的示例中,之间不存在类型关系IEnumerable<object>
and an IEnumerable<string>
,只是因为字符串是对象的子类型。它们只是被认为是两种完全不相关的类型,例如字符串和整数(它们仍然都是对象的子类型,但一切都是)
对于您遇到的此问题,有一些解决方法和例外情况。
首先,您可以将每个字符串单独转换为对象,如果您使用的是 .NET 3.0,则可以使用Cast<T>()
扩展方法。否则,您可以使用 foreach 并将结果放入所需静态类型的新变量中。
其次,数组是引用类型的一个例外,即将 string[] 类型传递给接受 object[] 类型的方法应该可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)