gpt4 book ai didi

c# - 双协方差

转载 作者:行者123 更新时间:2023-11-30 16:28:54 26 4
gpt4 key购买 nike

我有

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 建议在 getter 中进行转换;编译但在运行时失败。我是否期望 C# 4 中的协方差过多?

VS 2010 -> Silverlight 4. 这是编译错误

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 时才能正常工作,因为它需要新的框架更改。在这种情况下,IEnumerable<T> , 在 .NET 4 中,实际上是 IEnumerable<out T> ,这是工作所必需的。

关于c# - 双协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com