【问题标题】:Cannot Call Overridden List<T>.Add(...) in C#无法在 C# 中调用覆盖列表<T>.Add(...)
【发布时间】:2016-05-17 12:46:44
【问题描述】:

以下代码给出了错误 “无法将类型 'Calendar.Month' 转换为 'System.Collections.Generic.List'”:

public class Month : List<Day>, INotifyPropertyChanged
{
  public Month() { /* NOP */ }

  public new void Add<Day>(Day pValue)
  {
    var list = (List<Day>)this;

    list.Add(pValue);
  }
}

我在这里研究了建议: Why does calling a method in my derived class call the base class method?

这里:

C# Call shadow method with generic cast

我想用 Month.Add(...) 方法覆盖 List.Add(...) 方法以将事件发送到目标 XAML 容器类,然后调用覆盖的 List.Add(... ) 方法。

顺便说一句,我使用的是 VS2012、.NET 4.5,并且该应用程序适用于 Win Phone 8(目前不支持更高版本 - 抱歉)。我之所以提到这一点,是因为我从经验中知道 Win Phone 8 和 Win 10 之间发生了很大变化。

【问题讨论】:

  • 我确定您的意思是 base.Add(pValue); 而不是 list.Add(pValue);
  • 不使用继承为什么不使用组合?
  • 为什么要从List&lt;T&gt;继承而不是Collection&lt;T&gt;
  • 一个月是一个列表吗?没那么多。支持@juharr。一个月有几天的列表。
  • 我使用 List 而不是 Collection 因为 Laurent 和 Jaime 在他们的“数据绑定”讲座(第 40-49 分钟)中就是这样做的:mva.microsoft.com/en-US/training-courses/… 他们是错误?当数据绑定 ItemsControl 的内容时,List 是否不可用? PS。出于这个问题的目的,我将 Month 视为 List 。它旨在遵循 Laurent 和 Jaime 采取的方法。

标签: c# .net overriding super overloading


【解决方案1】:

这里的问题是泛型类型参数的使用和所有的转换。由于您已经将类从通用 List&lt;T&gt; 派生到 List&lt;Day&gt;,因此不需要其他类型参数。

铸造在这里并不是很有用。只需使用base.

public new void Add(Day pValue)
{
    base.Add(pValue);
}

不要使用List&lt;T&gt; 的自定义实现,而是使用ObservableCollection&lt;T&gt;,它已经为您完成了所有这些工作。

如果您想保留您的列表,请自行实施IList&lt;T&gt; 并使用后备列表来存储数据。在该课程中,您可以完全控制添加、删除等时的操作。

【讨论】:

  • 感谢您的评论。我已经尝试过您的建议,这就是我发现的原因: 1. 自己实施 IList 是可行的。但这里的目标是理解,所以我也..
  • (以上评论不完整) 感谢您的cmets。出于好奇,我尝试了您的每个建议,发现:1. 实现 IList&lt;T&gt; 编译和项目 Add(...)2. 使用List&lt;T&gt; 和使用base.Add(...) 调用就像上面一样 - 谢谢我刚刚忘记了'base'。这就是我需要的。 3. ObservableCollection&lt;T&gt; 编译,但我不熟悉它,所以比起复制 List&lt;T&gt;.Add(...) 之类的简单行为,我更费劲。我不认为这对我有多大帮助,因为我使用 INotifyPropertyChanged 实现了 Month 类 - 对吧?
  • 是的,应该这样做@rfreytag
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多