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?提前谢谢!
答案 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 ); }
}
}