【发布时间】:2016-10-10 17:32:13
【问题描述】:
Unity 的 C# 版本实现了协方差,但是对于我可以在网上找到的任何示例,此代码都无法编译
string[] stringArray = new string[0];
IEnumerable<string> stringIEnumerable = new string[0];
// string[] implements IEnumerable<string>,
// and implicitly casts to IEnumerable<object> through covariance
IEnumerable<object> objects1 = stringArray;
// But puzzling enough, one cannot implicitly
// convert IEnumerable<string> to IEnumerable<object> here
IEnumerable<object> objects2 = stringIEnumerable;
完全错误:
error CS0266: Cannot implicitly convert type `System.Collections.Generic.IEnumerable<string>' to `System.Collections.Generic.IEnumerable<object>'. An explicit conversion exists (are you missing a cast?)
是的,我现在明确地转换它,但我需要知道为什么会发生这种情况。我知道 Unity 的 C# 版本不是最后一个,但这种行为让我觉得很奇怪。我假设没有中间版本的 C# 在没有这些隐式转换的情况下实现协方差
附录:我喜欢干净的代码。我想知道如何使这些隐式转换起作用,因为在我使用它们的上下文中它们感觉非常正确和自然
【问题讨论】:
-
由于框架版本过时,我怀疑 Unity 是否支持接口协方差。您正在将它与 v.1 支持的数组协方差混合
-
@IvanStoev 数组协方差至少解释了为什么隐式转换有效(编译器必须解析为对象[])。但是,是的,Unity 支持协方差,或者至少看起来如此;我有一个隐式正确转换的协变接口。我只需要显式转换内置协变接口
-
我的意思是
IEnumerable<T>在 Unity 使用的框架版本中很可能不是协变的。所以如果你使用更新的编译器,你可以定义你自己的协变接口,但你不能重新定义系统的。 -
@IvanStoev 哦,我明白了。是的,我刚刚检查过,Unity 的 mscorlib 是 version=2.0.0.0,使用旧接口。我从来没有想过它是一个编译器功能,不依赖于框架。我很高兴至少编译器支持它
-
@IvanStoev 如果你愿意,请将其发布为答案,我会接受它
标签: c# unity3d covariance