为什么此代码在集合索引器中有新功能

时间:2012-07-27 03:20:09

标签: c# collections indexer

  

可能重复:
  “new” keyword in property declaration

请原谅我,如果这是C#101,但我想了解下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Generics
{
    class RabbitCollection : ArrayList
    {
        public int Add(Rabbit newRabbit)
        {
            return base.Add(newRabbit);
        }

        //collections indexer 
        public new Rabbit this[int index]
        {
            get { return base[index] as Rabbit; }
            set { base[index] = value; }
        }
    }
}

为什么索引器前面有new?顺便说一下,R​​abbit是另一个文件中定义的类。谢谢!

4 个答案:

答案 0 :(得分:6)

尝试从代码中删除新内容,您应该收到警告:

  

RabbitCollection.this [int]'隐藏继承的成员   'System.Collections.ArrayList.this [INT]'。 制作当前会员   覆盖该实现,添加override关键字。否则加   新关键字。

您可能希望查看new Modifier C#

  

新关键字显式隐藏从基类继承的成员。   隐藏继承的成员时,该成员的派生版本   替换基类版本。虽然你可以隐藏成员   使用new修饰符,结果是一个警告。如果你使用新的   要明确隐藏成员,它会禁止此警告和文档   派生版本旨在替代。

答案 1 :(得分:4)

因为基类(ArrayList)也有一个索引器。 new说“我故意用自己的一个替换基类成员。”

它也可以在没有new的情况下工作,但是new告诉编译器你知道你在做什么。

当然,在过去七八年的任何时间编写的代码中,您应该使用List<T>代替ArrayList,然后您不需要使用自己强大的后代-typed indexer。

答案 2 :(得分:4)

这是因为这个类隐藏了基类的一个成员(ArrayList也定义了相同的索引器)。

New告诉编译器这种行为是有意的而不是错误的。

阅读c# polymorphism guide

  

使用新的派生成员替换基类的成员需要   新关键字。如果基类定义方法,字段或属性,   new关键字用于创建该方法的新定义,   字段或派生类的属性。放置新关键字   在被替换的类成员的返回类型之前。

答案 3 :(得分:1)

通常,如果basetype意图重写方法,则会将其标记为virtual。在这种情况下,子类型只是用覆盖标记方法。

如果basetype没有,并且子类型定义了相同的方法,则存在歧义。 C#编译器要求你通过用new标记子类型方法来确认你想要这个 - 实际上说'是的我知道并且我想要隐藏基类型提供的方法'