【问题标题】:IEnumerable covariance requiring explicit cast in Unity3DIEnumerable 协方差需要在 Unity3D 中显式转换
【发布时间】: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&lt;T&gt; 在 Unity 使用的框架版本中很可能不是协变的。所以如果你使用更新的编译器,你可以定义你自己的协变接口,但你不能重新定义系统的。
  • @IvanStoev 哦,我明白了。是的,我刚刚检查过,Unity 的 mscorlib 是 version=2.0.0.0,使用旧接口。我从来没有想过它是一个编译器功能,不依赖于框架。我很高兴至少编译器支持它
  • @IvanStoev 如果你愿意,请将其发布为答案,我会接受它

标签: c# unity3d covariance


【解决方案1】:

原来协变是当前版本的 Unity 编译器支持的编译器特性,但实际框架是旧版本,其中泛型接口没有定义为具有协变类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多