C#-双协方差
作者:互联网
我有
public interface IFoo
{
IEnumerable<IThingy> Thingies{get;}
}
我想要然后能够做
class Thing1 : IThingy
{
...
}
class ImplementFoo : IFoo
{
List<Thing1> m_things;
IEnumerable<IThingy> Thingies {get {return m_things;}}
}
ImplementFoo.Thingies返回Thing1s(即IThings)的IList(这是IEnumerable).因此,从理论上讲,此代码应该起作用,但实际上不起作用. VS建议使用吸气剂.可以编译,但在运行时失败.我在C#4中期望太多的协方差吗?
VS 2010-> Silverlight4.这是编译错误
Cannot implicitly convert type ‘
System.Collections.Generic.List<MyProj.Column>
‘ to ‘System.Collections.Generic.IEnumerable<MyProj.IColumn>
‘. An explicit conversion exists (are you missing a cast?)
编辑:人们告诉我这应该工作,但在SL4中不工作
解决方法:
在C#/.NET 4中可以正常工作.这是一个完整的,可编译且有效的示例:
namespace Test
{
using System;
using System.Collections.Generic;
using System.Linq;
public interface IThingy { }
public interface IFoo
{
IEnumerable<IThingy> Thingies { get; }
}
internal class Thing1 : IThingy { }
internal class ImplementFoo : IFoo
{
private List<Thing1> m_things = new List<Thing1>() { new Thing1() };
public IEnumerable<IThingy> Thingies
{
get { return m_things; }
}
}
internal class Program
{
private static void Main(string[] args)
{
var impl = new ImplementFoo();
Console.WriteLine(impl.Thingies.Count());
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
我怀疑问题是您的目标是.NET 3.5sp1或更早版本,而不是.NET 4.0.协方差仅在面向.NET 4时才能正常工作,因为它需要进行新的框架更改.在这种情况下,.NET 4中的IEnumerable T实际上为IEnumerable<out T>
,这是工作所需的.
标签:covariance,c 来源: https://codeday.me/bug/20191208/2089208.html