C# 尴尬的继承问题

C# 尴尬的继承问题,c#,wpf,inheritance,C#,Wpf,Inheritance,情境: -我有一个从System.Windows.Controls.ItemsControl继承的第三方控件 -我有一个名为foo的控件实例 -foo有一个ListCollectionView数据源,有5个项目,没有筛选器。 -foo.Items.Count给出的结果为0 -(System.Windows.Controls.ItemsControl)(foo)).Items.Count共5个 发生这种情况的地方: -XAML.cs文件的构造函数 发生这种情况时: -在xaml.cs文件的构造函数

情境:
-我有一个从System.Windows.Controls.ItemsControl继承的第三方控件
-我有一个名为foo的控件实例
-foo有一个ListCollectionView数据源,有5个项目,没有筛选器。
-foo.Items.Count给出的结果为0
-(System.Windows.Controls.ItemsControl)(foo)).Items.Count共5个

发生这种情况的地方:
-XAML.cs文件的构造函数

发生这种情况时:
-在xaml.cs文件的构造函数中
-初始化组件后

未经核实的索赔:
-第三方控件的所有者声称它不会以任何方式覆盖项

问题:

-为什么foo.Items.Count返回的值与(System.Windows.Controls.ItemsControl)(foo)).Items.Count不同?听起来它们好像重新声明了属性,即

public new SomeContainer Items { get { ... } }
有时这样做是为了使
.Items
(等)的类型更具体;但是,它确实会破坏继承,除非注意重写底层实现。他们的主张——如果上述说法是正确的,那么他们确实没有以任何方式推翻它;他们正在重新声明它(这可能取决于“override”的字面意义)


但是:您可以在任何反射工具或IL检查工具中检查这一点,只需查看属性是如何声明的。它是否有
新的
新闻批
等。

听起来他们好像重新声明了该属性,即

public new SomeContainer Items { get { ... } }
有时这样做是为了使
.Items
(等)的类型更具体;但是,它确实会破坏继承,除非注意重写底层实现。他们的主张——如果上述说法是正确的,那么他们确实没有以任何方式推翻它;他们正在重新声明它(这可能取决于“override”的字面意义)


但是:您可以在任何反射工具或IL检查工具中检查这一点,只需查看属性是如何声明的。它有一个
新的
新闻批
,等等。

你需要显示一些代码。如果你打开一个反汇编程序(dotPeek是一个好的反汇编程序),你就能看到他们是否在告诉你真相。听起来可能有一个名为
Items
new
属性隐藏了基类的属性。为什么没有验证?为什么不打开ILSpy并检查一下?foo的静态类型是什么?JonathanM,这是第三方控制@jsWork,可能是第三方控件已使用新的修饰符创建了Items属性。使用反射来检查它。你需要显示一些代码。如果你打开一个反汇编程序(dotPeek是一个好的反汇编程序),你将能够看到他们是否在告诉你真相。听起来可能有一个名为
Items
new
属性隐藏了基类的属性。为什么没有验证?为什么不打开ILSpy并检查一下?foo的静态类型是什么?JonathanM,这是第三方控制@jsWork,可能是第三方控件已使用新的修饰符创建了Items属性。使用反射来检查它