直接比较C#值类型

时间:2011-06-03 02:48:16

标签: c# generics comparison operators

我已经阅读了有关C#值类型比较的以下声明 在C#in Depth,Second Edition中多次。

第77页,

  

当类型参数不受约束时(不对其应用约束),您可以使用==和!=运算符,但仅用于将该类型的值与null进行比较。您无法将T类型的两个值相互比较。

     

...

     

当类型参数被约束为值类型时,==和!=根本不能与它一起使用。

如果我理解(我不这么认为)它是正确的,它基本上告诉我你不能 使用==或!=来比较两种值类型。为什么为什么?

如果能够为这种情况提供一个简单的例子,那将会更好。有人可以给我 有点想法上面的段落试图传达什么?

2 个答案:

答案 0 :(得分:7)

在约束到值类型(第二段)

时,它只是意味着这一点
static bool TryToCompare<T>(T first, T second) where T : struct
{
    return first == second; // not legal
    return first.Equals(second); // legal
}

如果没有泛型的值类型约束,它也会说(第一段)

static bool TryToCompare<T>(T first, T second) 
{
    return first == second; // not legal
    return first == null; // legal
    return first.Equals(second); // legal
}

如果您将T限制为引用类型,则可以使用==

static bool TryToCompare<T>(T first, T second) where T : class
{
    return first == second; // legal
    return first == null; // legal
    return first.Equals(second); // legal
}

答案 1 :(得分:0)

对象无法比较,因为使用==的比较正在测试引用是否相同(内存地址)。您通常会使用if(string1.Equals(string2))。

我不明白的是,我已经看到了==使用字符串的情况,以及没有使用字符串的情况。