如何比较泛型类型的值?
我把它减少到最小的样本:
public class Foo<T> where T : IComparable
{
private T _minimumValue = default(T);
public bool IsInRange(T value)
{
return (value >= _minimumValue); // <-- Error here
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:
运算符'> ='不能应用于'T'和'T'类型的操作数.
到底怎么回事!?T
已被约束到IComparable
,甚至它限制值类型(的时候where T: struct
),我们仍然不能将任何运营商<
,>
,<=
,>=
,==
或!=
.(我知道,涉及到解决方法Equals()
的存在==
和!=
,但它并不能帮助对于关系运算符).
那么,有两个问题:
IComparable
?它不是以某种方式打败了通用约束的整个目的吗?(我意识到已经有一些问题与这个看似简单的问题有关 - 但没有一个线程能给出详尽或可行的答案,所以在这里.)
背景:我正在从TreeView中实现“拖放”。要求是拖动某一项应该不会改变选择-只有完成后,单击(上的MouseUp同一项目),应选择该项目。
但是,TreeView的默认行为是在MouseDown上引发SelectedItemChanged事件。关于如何改变的任何想法?
谢谢!
编辑:我忘了提到一个重要的观点-我很抱歉。我将Gong拖放框架用于所有拖放操作,因为它与MVVM很好地融合了(我的视图中不需要任何代码隐藏)。拖放逻辑是通过Views的XAML中的附加属性完全在ViewModels中处理的。
因此,PreviewMouseDown
本人涉及并处理所有选择和拖动逻辑的解决方案将适得其反。因此,我只是在寻找一种(简单的)方法来防止TreeView控件在鼠标按下时更改选择,同时仍然引发诸如等的常见冒泡事件MouseDown
,MouseMove
以使拖放库按设计工作。
我的下一个想法是自己修改Gong拖放库代码-我只是希望可以避免这种情况,并且有人会想出一种简单的方法来更改TreeView在这方面的行为。