编辑:这个问题在.NET 4中无效,因为它实际上可以正常工作。
我有一个Data类,必须实现这样的接口:
public interface IData
{
IEnumberable<IOther> OtherList { get; }
IOther AddOther();
void RemoveOtherData(IOther data);
}
但我仍然坚持在Data
中声明实际成员public class Data : IData
{
// desired, always return the same reference
public IEnumberable<IOther> OtherList { get { return _mOtherList } }
// Non persistent reference not desirable.
public IEnumerable<IOther> OtherList { get { return _mOtherList.Select(x => x as IOther); } }
List<IOther> _mOtherList = new List<Other>(); // error, type mismatch
List<Other> _mOtherList = new List<Other>(); // error, property return type mismatch
IEnumerable<IOther> _mOtherList = new List<Other>(); // ok, but cannot use List methods without casting.
}
在这种情况下,最佳解决方案是什么?
答案 0 :(得分:2)
public class Data : IData
{
public IEnumerable<IOther> OtherList { get; private set; }
List<Other> _mOtherList = new List<Other>();
public Data()
{
OtherList=mOtherList.Cast<IOther>();
}
}
On .net 4 IEnumerable<out T>
是共变体。即实现IEnumerable<Other>
的类也会自动实现IEnumerable<IOther>
。所以也可以简单地写一下:
public class Data : IData
{
public IEnumerable<IOther> OtherList { get{return mOtherList;} }
List<Other> _mOtherList = new List<Other>();
}
但是我会避免这种情况,因为它打破了封装并允许外人修改你的列表。
((List<Other>)MyData.OtherList).Add(...);
答案 1 :(得分:1)
其他类必须实现IOther接口,您不需要强制转换。
当你声明_mOtherList时,它是IEnumerable,所以你不能使用list方法。将其声明为列表。
public class Data : IData
{
List<IOther> _mOtherList = new List<Other>();
public IEnumberable<IOther> OtherList { get { return _mOtherList } }
IOther AddOther()
{
return null;
}
void RemoveOtherData(IOther data){}
}
你的其他课程:
class Other : IOther
{
//some members
}
答案 2 :(得分:0)
由于IEnumerable是协变的,所以很好:
public interface IInterface{}
public class ClassA : IInterface{}
public class ClassB
{
private readonly List<ClassA> _classAs;
public IEnumerable<IInterface> Data{ get { return _classAs; } }
}