1

我对 C# 还很陌生,所以如果这是一个愚蠢的问题,请原谅我。我遇到了一个错误,但我不知道如何解决它。我正在使用 Visual Studio 2010。我已经实施了社区成员的几个修复,但问题似乎不断出现。

它从这个代码行开始

public class GClass1 : KeyedCollection<string, GClass2>

我给了我错误

'GClass1' does not implement inherited abstract member 'System.Collections.ObjectModel.KeyedCollection<string,GClass2>.GetKeyForItem(GClass2)'

从我读过的内容来看,这可以通过在继承类中实现抽象成员来解决,就像这样

public class GClass1 : KeyedCollection<string, GClass2>
{
  public override TKey GetKeyForItem(TItem item);
  protected override void InsertItem(int index, TItem item)
  {
    TKey keyForItem = this.GetKeyForItem(item);
    if (keyForItem != null)
    {
        this.AddKey(keyForItem, item);
    }
    base.InsertItem(index, item);
}

然而,这给了我错误,说“找不到类型或命名空间名称 TKey/TItem 找不到。” 所以我替换了占位符类型。

目前代码是

public class GClass1 : KeyedCollection<string, GClass2>
{

  public override string GetKeyForItem(GClass2 item);
  protected override void InsertItem(int index, GClass2 item)
  {
    string keyForItem = this.GetKeyForItem(item);
    if (keyForItem != null)
    {
      this.AddKey(keyForItem, item);
    }
  base.InsertItem(index, item);
 }

我完全忘记了 GetKeyForItem 是受保护的。新错误告诉我在覆盖 System.Collections.ObjectModel.KeyedCollection.GetKeyForItem(GCl‌​ass2) 时无法更改访问修饰符。

我也收到一个奇怪的错误,说“GClass1.GetKeyForItem(GClass2)”必须声明一个主体,因为它没有被标记为抽象、外部或部分的

访问修饰符问题是否有任何解决方法,有人可以解释“声明一个主体,因为它没有被标记”错误吗?

谢谢!

4

3 回答 3

2

GetKeyForItem在基抽象类中受到保护,因此它必须在派生类中受到保护。(另外,我想你会想要实现它——这是你的第二个错误的根源,因为方法必须有一个主体,除非它们是抽象的。)

这应该编译:

protected override string GetKeyForItem(GClass2 item)
{
    throw new NotImplementedException();

    // to implement, you'd write "return item.SomePropertyOfGClass2;"
}
于 2012-11-20T18:27:20.867 回答
2

您需要完全按照定义的方式实现抽象方法。如果您希望该方法可以公开访问,而不是仅具有protected它定义的可访问性,您需要添加一个新的、单独的方法来使用它:

public class GClass1 : KeyedCollection<string, GClass2>
{
    protected override string GetKeyForItem(GClass2 item)
    {
        throw new NotImplementedException();
    }

    public string GetKey(GClass2 item)
    {
        return GetKeyForItem(item);
    }
}
于 2012-11-20T18:30:33.863 回答
0

该错误'GClass1.GetKeyForItem(GClass2)' must declare a body because it is not marked abstract, extern, or partial'可能意味着您需要实现该方法,而不是简单地在您的类中声明它。实际上,您需要在其中添加一段代码

protected override string GetKeyForItem(GClass2 item)
{
     // some code
}

即使它什么也不做。

于 2012-11-20T18:29:51.767 回答