正如我在上一个问题中所提出的那样,我坚持IComparer<T>
执行。
我有一个接口和类,实现了一个:
public interface IRoom
{
// ...
}
public class Room : IRoom
{
// ...
}
还有一个比较器父子类:
public abstract class RoomComparer : IComparer<Room>
{
public RoomComparer()
{
}
public abstract int Compare(Room x, Room y);
}
public class StandardMultipliedSquareMetersComparer : RoomComparer
{
public StandardMultipliedSquareMetersComparer()
{
}
public override int Compare(Room a, Room b)
{
// ...
}
}
public class SquareMetersComparer : RoomComparer
{
public SquareMetersComparer()
{
}
public override int Compare(Room a, Room b)
{
// ...
}
}
现在,我需要使用我的IRoom
孩子和一个RoomComparer
孩子作为此类的通用类型参数:
public class Hotel<TRoom, TComparer> : IHotel, IEnumerable<TRoom>
where TRoom : class, IRoom
where TComparer : RoomComparer, new()
{
public List<TRoom> Rooms;
protected TComparer Comparer;
public Hotel(int stars, TRoom[] rooms)
{
Rooms = new List<TRoom>();
_stars = stars;
Rooms.AddRange(rooms);
Comparer = new TComparer();
Rooms.Sort(Comparer);
}
// ...
}
但是编译失败在线
Rooms.Sort(Comparer);
有两个错误
错误CS1502:“ System.Collections.Generic.List.Sort(System.Collections.Generic.IComparer)”的最佳重载方法匹配具有一些无效的参数(CS1502)
错误CS1503:参数
#1' cannot convert
TComparer表达式键入“ System.Collections.Generic.IComparer”(CS1503)
从我的角度来看,OOP模型是正确的,并且如果Hotel
类构造函数的参数实现IRoom
,就像这样:new Hotel<Room, SquareMetersComparer>
,那么它应该正确地传递给RoomsComparer
类构造函数,然后RoomComparer
正确地传递给List.Sort()
方法。但是编译器以其他方式思考...
所以,问题是:怎么了?
如果这有助于莫名其妙:我使用Mono 5.10.0
的Ubuntu 14.04
。
TComparer
被定义为继承RoomComparer
。这意味着它实现IComparer
了Room
。您的列表包含的实例TRoom
,这些实例实现IRoom
,而不是Room
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句