2010-03-01 41 views
3

我绝对不能硬编码的数据类型。我需要严格的数据输入。我必须使用TValue a < = TValue b。再次,绝对没有办法做像(双)一样的东西。这是基本库实现的一部分。唯一具体关于通用值的是它们是静态类型。 IComparable和其他界面似乎不起作用。必须实现一个通用的小于和大于操作

+5

问题是...? – Krab

+8

你给了+1,同时也承认你不知道问题是什么? :-) –

回答

31

为什么IComparable无法为您工作?

您可能无法获得使用“<”和“>”符号的语法糖,但您可以检查CompareTo的结果是否小于或大于0,这会给出相同的信息。

你甚至可以写一个很好的扩展方法,使其更容易使用。

static void Main(string[] args) 
{ 
    Console.WriteLine(1.IsGreaterThan(2)); 
    Console.WriteLine(1.IsLessThan(2)); 
} 

public static bool IsGreaterThan<T>(this T value, T other) where T : IComparable 
{ 
    return value.CompareTo(other) > 0; 
} 

public static bool IsLessThan<T>(this T value, T other) where T : IComparable 
{ 
    return value.CompareTo(other) < 0; 
} 
+2

或限制为'IComparable '。 – TrueWill

3

你能更准确地处理你的数据类型和用例吗?

毕竟,要实现一个比较操作,你需要一些关于类的信息;一个完全通用的实现通常没有比较两个对象所需的信息 - 除非你想在GetHashCode()或ToString()上对它们进行排序,这是非常奇怪的事情。

有用于类型安全的比较各种通用接口:

如果您在自己的类型实现IComparableIComparable<T>,那么你可以使用Comparer<T>.Default自动获取后者的变体 - 这使得消费者比较矮一点写的,是需要通用约束替代类型为IComparable<T>

+0

+1用于解释“Comparer .Default”的作用,以及何时有用。 – ToolmakerSteve

15

只需使用System.Collections.Generic.Comparer<T>.Default.Compare(x,y) - 并查找负值,正值和0返回值。

这同时支持IComparable<T>IComparable,并且可以用于类,结构和结构体中的Nullable<T>

+5

-ve和+ ve是什么? – Gabe

+0

这似乎在伎俩。我正在使用Visual Studio Express 2010 Beta,而Intellisense似乎没有认识到这种情况。非常奇怪的行为。 –

+3

@gabe:他们是写作“积极”和“消极”的简写方式。 –

相关问题