Tag: 平等

等于int和short c#返回false

考虑以下代码: static int x2 = 10; public static void Main() { short y = 10; Console.WriteLine(y.Equals(x2)); //False Console.Read(); } 为什么y.Equals(x2)返回false ?

C#中相等的最小代码

在本文中 ,Eric Lippert在第9点建议C#具有“太多平等”。 他指出,有9或10种不同的方法或运算符可以重载以提供对象相等性。 我的第一个问题是 – 如果重写了Object.Equals(object)方法,编译器是否可以调用任何其他相等运算符,如==,!=,<=等,而无需明确执行此操作的代码? 在C ++中,这种行为有先例。 编译器可以在需要生成临时变量的某些位置调用复制构造函数。 我至少95%肯定这不会发生在C#中,但它实际上取决于编译器的构造方式以及边缘情况。 第二个问题是 – 如果编译器永远不会间接调用任何相等运算符,那么小型,中型甚至大型项目是否可以指定只使用Object.Equals(object)方法和IEquatable来实现如果类型将用于排序或其他时间确定对象的等级需要使用等式测试和IComparable吗? 换句话说 – 如果项目中的每个人都同意他们不会被使用并因此是不必要的,那么可以避免定义其他相等运算符吗? 假设代码仅在项目中使用,不会导出供第三方使用。

为什么((object)(int)1).Equals(((object)(ushort)1))产生错误?

我有一个情况,我有一个object ,我想检查与另一个object相等性。 public static bool Equals(object a, object b) { return a.Equals(b); } 当a = 1 (integer)且b = 1 (ushort (or basically not integer)) 。 我想知道这不应该是真的,但它确实会返回假… 编辑 更糟糕的是: Hashtable ht = new Hashtable(); ht.Add((int)1, “SOME STRING”); ht.Add((short)1, “SOME STRING”); ht.Add((long)1, “SOME STRING”); 我认为值’1’应该只允许一次。

Resharper建议:检查参考相等性

我不明白为什么Resharper建议我在这段代码中“检查引用相等”: if ( typeToTranslate.Equals( typeof(string) ) ) { //do something } 为什么这应该更好: typeToTranslate == typeof(string) – – – – – – 编辑 – – – – – – 这是方法存根: protected IType TranslateType(Type typeToTranslate) { if (typeToTranslate == null) throw new ArgumentNullException(“typeToTranslate”); //do some stuff if (typeToTranslate.Equals(typeof(string))) { //do some stuff } //return some stuff }

LINQ:通过使它们可转换/可比较,对不同类型的集合使用.Except()吗?

给定两个不同类型的列表,是否可以使这些类型在彼此之间可转换或相互比较(例如使用TypeConverter或类似),以便LINQ查询可以比较它们? 我已经在SO上看过其他类似的问题,但没有任何指出使类型可以在彼此之间进行转换以解决问题。 收集类型: public class Data { public int ID { get; set; } } public class ViewModel { private Data _data; public ViewModel(Data data) { _data = data; } } 所需用法: public void DoMerge(ObservableCollection destination, IEnumerable data) { // 1. Find items in data that don’t already exist in destination var newData = destination.Except(data); […]

C#对象比较

有人可以指出重载operator==的想法来执行深度对象比较(而不是参考比较)。 来自MSDN: 默认情况下,operator ==通过确定两个引用是否指示同一对象来测试引用相等性。 因此,引用类型不必实现operator ==以获得此function。 当一个类型是不可变的,也就是说,实例中包含的数据不能被改变,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,它们可以被认为是相同的因为它们具有相同的价值。 在非不可变类型中覆盖operator ==不是一个好主意。 什么时候才真正受益? 并且,如果每个对象都有方法Equals ,这使得值比较成为可能,为什么有人会使用x == y语句执行值 (而不是引用)比较? 我想我不明白,因为这对我来说很奇怪。

为什么通用类型定义实现的接口会丢失类型信息?

例如,如果您运行以下代码… Type IListType = new List().GetType() .GetInterface(“IList`1”) .GetGenericTypeDefinition(); …并且您观察IListType变量,您会发现整个Type实例具有FullName等所有可用属性。 但是当你运行代码时会发生什么? Type IListType2 = typeof(List).GetInterface(“IList`1”) 现在,来自generics类型定义的IListType与第一个代码示例不同:大多数Type属性将返回null。 这个问题的主要问题是IListType == IListType2不等于它们是相同的类型。 这是怎么回事? 这太丑了…… 现在看看如果调用IListType2.GetGenericTypeDefinition()会发生什么……它恢复了类型信息! .NET Framework开发团队成员可以解释为什么一个奇怪地丢失其元数据的已经generics的类型定义为什么IsGenericTypeDefinition属性设置为false而它仍然是generics类型定义,最后,如果你调用GetGenericTypeDefinition()在它上面,你恢复了类型信息。 这很奇怪… 以下等式将true : Type IListType = new List().GetType() .GetInterface(“IList`1”) .GetGenericTypeDefinition(); // Got interface is “like a generic type definition” since it has // no type for T generic parameter, and once you […]

比较没有拳击的平等结构

我遇到了一个适用于结构(SomeStruct)的扩展方法,并返回该值是否等于default(SomeStruct) (当调用无参数构造函数时)。 public static bool IsDefault (this T value) where T : struct { return (!EqualityComparer.Default.Equals(value, default(T))); } 这让我想知道结构是否被装箱。 这纯粹是出于好奇,因为根据上下文有拳击/传递值的优点/缺点。 假设: 以下第一种方法是非法的,因为结构不会隐式覆盖相等运算符==/!= 。 第二个“出现”以避免拳击。 第三种方法应该总是选中struct,因为它调用了object.Equals(object o) 。 第四个有两个可用的重载(object/T)所以我假设它也会避免装箱。 但是,目标结构需要实现IEquatable接口,这使得辅助扩展方法不是很有用。 变化: public static bool IsDefault (this T value) where T : struct { // Illegal since there is no way to know whether T implements the […]

什么时候两个枚举在C#中相同?

我创建了两个枚举,我知道它们不一样,但我认为它们是相同的,因为它们的字符串表示以及它们的数字表示相等(甚至相同……)。 换句话说:我希望第一个测试通过,第二个测试失败。 但实际上,他们都失败了。 那么:C#中的两个枚举何时相等? 或者无论如何在C#中定义equals运算符? 谢谢! public enum enumA {one, two} public enum enumB {one, two} [Test] public void PreTest() { Assert.AreEqual(enumA.one,enumB.one); Assert.AreSame(enumA.one, enumB.one); } 更新:1)所以到目前为止所有答案都比较表示,无论是整数还是字符串。 enum 本身总是不平等的我聚集在一起? 没有办法为它定义平等吗?

如果我实现IEquatable ,重写Equals是否重要?

我知道在实现自定义相等性检查时重写GetHashCode的重要性 – 我已经实现了IEquality接口,以及此处讨论的generics和非genericsEquals之间的区别。 现在有一个重写Equals(object t)吗? 难道一切都不会归入通用Equals(T t)吗? public override int GetHashCode() //required for hashsets and dictionaries { return Id; } public bool Equals(T other) //IEquatable here { return Id == other.Id; } public override bool Equals(object obj) //required?? { return Equals(obj as T); }