IComparer <T>不能使用class作为参数

shybovycha

正如我在上一个问题中所提出的那样,我坚持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 convertTComparer表达式键入“ System.Collections.Generic.IComparer”(CS1503)

从我的角度来看,OOP模型是正确的,并且如果Hotel类构造函数的参数实现IRoom,就像这样:new Hotel<Room, SquareMetersComparer>,那么它应该正确地传递给RoomsComparer类构造函数,然后RoomComparer正确地传递给List.Sort()方法。但是编译器以其他方式思考...

所以,问题是:怎么了?

如果这有助于莫名其妙:我使用Mono 5.10.0Ubuntu 14.04

贾普·埃尔格斯玛(Jaap Elgersma)

TComparer被定义为继承RoomComparer这意味着它实现IComparerRoom您的列表包含的实例TRoom,这些实例实现IRoom,而不是Room

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IComparer <T>子级作为通用参数不能在Sort中使用

来自分类Dev

在C#中使用IComparer <T> .Compare(T,T)

来自分类Dev

C#-将参数作为输入的自定义IComparer <T>

来自分类Dev

不能使用“T”作为具体化的类型参数

来自分类Dev

使用IComparer的抽象类

来自分类Dev

IComparer <T>和泛型类型方法问题

来自分类Dev

IComparer <T>和泛型类型方法问题

来自分类Dev

如何使用IComparable和IComparer对对象列表进行排序

来自分类Dev

使用IComparer的排序列表返回错误的结果

来自分类Dev

可以使用IComparer对列表进行哈希处理吗?

来自分类Dev

C#使用IComparer对x列数进行排序

来自分类Dev

使用IComparer比较函数C#对ArrayList进行排序

来自分类Dev

使用自定义IComparer按日期对DataGridView进行排序

来自分类Dev

使用自定义IComparer按指针值排序

来自分类Dev

我们应该扩展Comparer <T>还是实现IComparer <T>

来自分类Dev

为什么派生自Comparer <T>类而不是实现IComparer <T>接口的实现类?

来自分类Dev

MSTest-为什么没有AreEqual(object,object,IComparer <T>)?

来自分类Dev

为什么List <T> .Sort(IComparer <T>)和List <T> .Sort(Comparison <T>)处理拐角案例的方式不同?

来自分类Dev

不能使用变量作为参数

来自分类Dev

自定义icomparer错误-无法从用法中推断出类型参数

来自分类Dev

String.Replace和Regex.Replace无法在IComparer中使用特殊字符

来自分类Dev

IComparer无法正常工作

来自分类Dev

IComparer 比较枚举的值

来自分类Dev

不能使用lambda表达式作为动态参数

来自分类Dev

为什么我不能使用std:cin作为参数

来自分类Dev

不能使用lambda表达式作为动态参数

来自分类Dev

为什么不能使用公共静态<T,U> T [] copyOf(U [] original,int newLength,Class <?将Integer数组转换为String数组,扩展T []> newType)

来自分类Dev

vb.net TreeView IComparer

来自分类Dev

使用接口作为List <T>的参数

Related 相关文章

  1. 1

    IComparer <T>子级作为通用参数不能在Sort中使用

  2. 2

    在C#中使用IComparer <T> .Compare(T,T)

  3. 3

    C#-将参数作为输入的自定义IComparer <T>

  4. 4

    不能使用“T”作为具体化的类型参数

  5. 5

    使用IComparer的抽象类

  6. 6

    IComparer <T>和泛型类型方法问题

  7. 7

    IComparer <T>和泛型类型方法问题

  8. 8

    如何使用IComparable和IComparer对对象列表进行排序

  9. 9

    使用IComparer的排序列表返回错误的结果

  10. 10

    可以使用IComparer对列表进行哈希处理吗?

  11. 11

    C#使用IComparer对x列数进行排序

  12. 12

    使用IComparer比较函数C#对ArrayList进行排序

  13. 13

    使用自定义IComparer按日期对DataGridView进行排序

  14. 14

    使用自定义IComparer按指针值排序

  15. 15

    我们应该扩展Comparer <T>还是实现IComparer <T>

  16. 16

    为什么派生自Comparer <T>类而不是实现IComparer <T>接口的实现类?

  17. 17

    MSTest-为什么没有AreEqual(object,object,IComparer <T>)?

  18. 18

    为什么List <T> .Sort(IComparer <T>)和List <T> .Sort(Comparison <T>)处理拐角案例的方式不同?

  19. 19

    不能使用变量作为参数

  20. 20

    自定义icomparer错误-无法从用法中推断出类型参数

  21. 21

    String.Replace和Regex.Replace无法在IComparer中使用特殊字符

  22. 22

    IComparer无法正常工作

  23. 23

    IComparer 比较枚举的值

  24. 24

    不能使用lambda表达式作为动态参数

  25. 25

    为什么我不能使用std:cin作为参数

  26. 26

    不能使用lambda表达式作为动态参数

  27. 27

    为什么不能使用公共静态<T,U> T [] copyOf(U [] original,int newLength,Class <?将Integer数组转换为String数组,扩展T []> newType)

  28. 28

    vb.net TreeView IComparer

  29. 29

    使用接口作为List <T>的参数

热门标签

归档