当前位置:  开发笔记 > 编程语言 > 正文

c#比较两个通用值

如何解决《c#比较两个通用值》经验,为你挑选了1个好方法。

你不能在泛型类型上使用运算符(除了foo == null,这是特殊的),除非你添加T:class来表示它是一个引用类型(然后foo == bar是合法的)

使用EqualityComparer.Default为您完成.这不适用于仅为==提供运算符重载的类型,而且也不会:

实行 IEquatable

覆盖object.Equals()

一般来说,实现==运算符而不是至少执行其中一个操作也是一个非常糟糕的主意,所以这不是一个问题.

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

    return !EqualityComparer.Default.Equals(value1 , value2);
}

如果你不限制IEquatable那么EqualityComparer默认回退可能会导致装箱与值类型一起使用时如果它们没有实现IEquatable(如果你控制正在使用的类型,这可能无关紧要).我假设你正在使用=!虽然如此限制Generic类型将避免通过Object.Equals(对象)路由意外装箱.



1> ShuggyCoUk..:

你不能在泛型类型上使用运算符(除了foo == null,这是特殊的),除非你添加T:class来表示它是一个引用类型(然后foo == bar是合法的)

使用EqualityComparer.Default为您完成.这不适用于仅为==提供运算符重载的类型,而且也不会:

实行 IEquatable

覆盖object.Equals()

一般来说,实现==运算符而不是至少执行其中一个操作也是一个非常糟糕的主意,所以这不是一个问题.

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

    return !EqualityComparer.Default.Equals(value1 , value2);
}

如果你不限制IEquatable那么EqualityComparer默认回退可能会导致装箱与值类型一起使用时如果它们没有实现IEquatable(如果你控制正在使用的类型,这可能无关紧要).我假设你正在使用=!虽然如此限制Generic类型将避免通过Object.Equals(对象)路由意外装箱.


实际上,你不需要T:IEquatable 限制 - 没有它,使用.Equals
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有