为什么C#编译器无法理解在单独的类中使用的泛型参数?

时间:2011-07-04 15:05:49

标签: c# generics

这是我的代码:

public class Range<TNum> where TNum : IComparable
{
    public TNum From { get; set; }
    public TNum To { get; set; }
}

public class MarkableRange<TNum> where TNum : IComparable
{
    private readonly List<Range<TNum>> _markedRanges = new List<Range<TNum>>();

    public void MarkOne(TNum number)
    {
        _markedRanges.Where(r => number >= r.From && number <= r.To);
    }
}

编译器说它无法对number >= r.Fromnumber <= r.To中的操作数应用运算符&gt; =

我可以逃脱List<Tuple<TNum, TNum>>,但我想要更有意义的事情。 那么我做错了什么或c#编译器不是那么聪明才能理解我的意图?

2 个答案:

答案 0 :(得分:7)

TNum仅限于实施IComparable,而<=没有您正在使用的运算符(>=CompareTo)。您应该使用public void MarkOne(TNum number) { _markedRanges.Where(r => number.CompareTo(r.From) >= 0 && number.CompareTo(r.To) <= 0); } 方法:

IComparable<T>

要使用运算符,请查看here

此外,更喜欢通用{{1}}。

答案 1 :(得分:0)

您可以在C#中重载运算符,因此您可以在Range类上定义委托给IComparable实现的&gt; =和&lt; =运算符。应该工作。