在接口</t> </t>中列出<t>到IEnumerable <t>问题

时间:2011-09-21 16:29:57

标签: c#

namespace WpfApplication3
{
public class Hex
{
    public String terr;
}    

public class HexC : Hex
{
    int Cfield;
}

public interface IHexGrid
{
    IEnumerable<Hex> hexs { get; }
}

public class hexGrid : IHexGrid //error CS0738: 'WpfApplication3.hexGrid' does not               
{
    public List<Hex> hexs { get; set; }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        List<HexC> hexList1 = new List<HexC>();
        genmethod(hexList1); //but this compiles fine          
    }

    void genmethod(IEnumerable<Hex> hexList)
    {
        string str1;
        foreach (Hex hex in hexList)
            str1 = hex.terr;            
    }
}
}

完整的错误消息是:'WpfApplication3.hexGrid'没有实现接口成员'WpfApplication3.IHexGrid.hexs'。 'WpfApplication3.hexGrid.hexs'无法实现'WpfApplication3.IHexGrid.hexs',因为它没有匹配的返回类型'System.Collections.Generic.IEnumerable'。

为什么List没有隐式地转换为IEnumerable?提前谢谢!

2 个答案:

答案 0 :(得分:4)

那种转换(协方差?)不适用于类/接口声明。它只能在参数和返回类型上完成。

编译器正在寻找确切的签名,找不到它,并正确地说你没有实现该成员。属性/方法签名必须完全匹配。

This answer实际上总结得比我解释的要好。

答案 1 :(得分:3)

Christopher有正确的答案,但您可以通过将私有属性作为实际列表轻松解决此问题,然后hexGrid上的getter只返回List中的已铸造IEnumerable接口。

public class hexGrid : IHexGrid               
{
    private List<Hex> _hexs { get; set; }
    public IEnumerable<Hex> hexs
    {
       get { return _hexs as IEnumerable; }
       set { _hexs = new List<Hex>( value ); }
    }
}