相关疑难解决方法(0)

c#比较两个通用值

可能重复:
不能将运算符==应用于C#中的泛型类型?

我编写了这样的代码:

public bool IsDataChanged()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return (valueInDB != valueFromView);
}
Run Code Online (Sandbox Code Playgroud)

现在该函数没有编译错误" 运算符'!='不能应用于'T'和'T'类型的操作数 ".我该怎么做才能使这个功能起作用?

c# generics

68
推荐指数
3
解决办法
7万
查看次数

EqualityComparer <T>.默认不够聪明

我正在阅读源代码,EqualityComparer<T>.Default发现它并不那么聪明.这是一个例子:

enum MyEnum : int { A, B }
EqualityComparer<MyEnum>.Default.Equals(MyEnum.A, MyEnum.B)
//is as fast as 
EqualityComparer<int>.Default.Equals(0, 1)

enum AnotherEnum : long { A = 1L, B = 2L }
//is 8x slower than
EqualityComparer<long>.Default.Equals(1L, 2L)
Run Code Online (Sandbox Code Playgroud)

原因很明显来自EqualityComparer中私有方法的源代码.

private static EqualityComparer<T> CreateComparer()
{
    //non-important codes are ignored
    if (c.IsEnum && (Enum.GetUnderlyingType(c) == typeof(int)))
    {
        return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(EnumEqualityComparer<int>), c);
    }
    return new ObjectEqualityComparer<T>();
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到EqualityComparer<int>.Default,EqualityComparer<MyEnum>.DefaultEqualityComparer<long>.Default得到一个明智的比较器,其Equals方法如下:

public static bool Equals(int x, int y) …
Run Code Online (Sandbox Code Playgroud)

.net c# enums equals iequalitycomparer

8
推荐指数
1
解决办法
3184
查看次数

直接比较C#值类型

我已经阅读了以下关于C#在深度,第二版中多次比较C#值类型的声明.

第77页,

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

...

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

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

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

c# generics comparison operators

5
推荐指数
1
解决办法
1211
查看次数

标签 统计

c# ×3

generics ×2

.net ×1

comparison ×1

enums ×1

equals ×1

iequalitycomparer ×1

operators ×1