为什么不是0 == 0?

时间:2013-02-12 20:36:41

标签: c# system.reflection

Activator.CreateInstance(p.PropertyType) == value是假的

给出类型T:

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

关于财产的预告:

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。这是根据How can I call default(T) with a type?Create default instance of type创建默认值的答案,但我似乎无法==.Equals来测试相等性?

1 个答案:

答案 0 :(得分:8)

这里简单的答案是它们是不同的对象。此上下文中的==运算符检查两个表达式是否引用相同的对象。虽然两个对象的值可能相同,但是对象不是同一个对象,因此不相等。

要确定两个对象是否具有相同的值,您应该使用: (<expression 1>).Equals(<expression2) 而不是<expression 1> == <expression 2>

您可能需要覆盖Equals方法以使其在C#中工作,因为我默认情况下看到该方法检查的条件与==相同。请参阅here