为什么0不等于0?

4

Activator.CreateInstance(p.PropertyType) == value 是false

给定一个类型T:

public class ODataTestHelper
        {
            public int DataId { get; set; }
            public string DataItem { get; set; }
        }

并且使用foreach循环遍历属性:

public string BuildQuery<T>(T searchModel,int page, int pageSize)
{
  var type=typeof(T);
  var filters = new List<string>();
  foreach (var p in type.GetProperties())
  {
    var value=p.GetValue(searchModel,null);
    if(value == null || value.ToString().IsNullOrEmpty() || (p.PropertyType.IsValueType && Activator.CreateInstance(p.PropertyType) == value ))
        continue;
     filters.Add(string.Format("{0} eq {1}", p.Name, WrapTypeValue(p.PropertyType, value)));
  }
   if (filters.Any())
        {
            result += "&$filter=" + filters.Aggregate((s1, s2) => s1 + " and ");
        }
        return result;
 }

给定一个测试方法
[TestMethod]
        public void BuildQuery_StringProperty_ItRendersTheFilter()
        {
            const string x = "foo";
            string expected =String.Format( "&$filter={0} eq '{1}'",LinqOp.PropertyOf(() => default(ODataTestHelper).DataItem).Name , x);
            var od = new ODataBinder("http://localhost/");
            var q = od.BuildQuery(new ODataTestHelper { DataItem = x}, 0, 0);
            Assert.IsTrue(q.Contains(expected), string.Format("{0} did not contain {1}", q, expected));

        }

立即窗口确认默认输出为0,实例中的值也是0。它还确认了p.PropertyType.IsValueType

0与调用Activator.CreateInstance(p.PropertyType)不相等,因此它不会跳过未初始化的DataId。这是根据如何使用类型调用default(T)创建类型的默认实例的答案,但我似乎无法使用==.Equals测试相等性?

1个回答

8
简单来说,它们是不同的对象。在这种情况下,==运算符用于检查两个表达式是否引用同一对象。虽然两个对象的值可能相同,但它们不是同一个对象,因此不相等。
为了确定两个对象是否具有相同的值,您应该使用: (<expression 1>).Equals(<expression2) 而不是<expression 1> == <expression 2> 您可能需要覆盖C#中的Equals方法才能使其正常工作,因为默认情况下该方法检查与==相同的条件。请参见此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接