编程语言
首页 > 编程语言> > C#-双协方差

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