Почему член базового класса отличается от того же члена в производном классе?
Это продолжение этого вопроса: лямбда-выражение не возвращает ожидаемого MemberInfo
class Human
{
public string name { get; set; }
}
class Man : Human
{
}
var m1 = typeof(Human).GetProperty("name");
var m2 = typeof(Man).GetProperty("name");
//m1 != m2 why?
То же самое относится и к MethodInfo
s.
Я могу понять, что должна быть разница, когда Human
это интерфейс, или когда name
из Human
является абстрактным / виртуальным. Но почему это так для закрытых типов? не name
из Man
именно так name
из Human
?
Пояснение: как Джон говорит их ReflectedType
с разные. ReflectedType
равенство должно пригодиться при принятии решения о равенстве членов интерфейса или переопределенных членов, поскольку они различны. Но я не думаю, что это следует учитывать для принятия решения о равенстве простых случаев, как указано выше. Может быть, команда дизайнеров хотела быть последовательной. Просто интересно, какое обоснование заставило дизайнеров фреймворков задуматься ReflectedType
свойство в решении равенства одного и того же члена, охватывающего несколько классов.
1 ответ
Они отличаются по своему ReflectedType
имущество:
Свойство ReflectedType извлекает объект Type, который использовался для получения этого экземпляра MemberInfo. Это может отличаться от значения свойства DeclaringType, если этот объект MemberInfo представляет член, который унаследован от базового класса.
Так что, если вы распечатываете m1.ReflectedType
, это должно напечатать Human
, Если вы распечатываете m2.ReflectedType
, это должно напечатать Man
,
РЕДАКТИРОВАТЬ: с точки зрения того, почему оператор равенства реализован таким образом: это всегда деликатное проектное решение, чтобы выяснить, что ==
должно означать, в случае, когда могут быть различимые, но не "первичные" различия между объектами. Это где предоставление разных IEqualityComparer
реализации полезны, но, конечно, это не работает для самих операторов.
В общем, если x == y
верно, то это довольно необычно для x.Foo
отличаться от y.Foo
за любую недвижимость. Я не могу сразу думать о каких-либо случаях, когда это происходит в рамках.