请原谅我,如果这是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
?顺便说一下,Rabbit是另一个文件中定义的类。谢谢!
答案 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告诉编译器这种行为是有意的而不是错误的。
使用新的派生成员替换基类的成员需要 新关键字。如果基类定义方法,字段或属性, new关键字用于创建该方法的新定义, 字段或派生类的属性。放置新关键字 在被替换的类成员的返回类型之前。
答案 3 :(得分:1)
通常,如果basetype意图重写方法,则会将其标记为virtual。在这种情况下,子类型只是用覆盖标记方法。
如果basetype没有,并且子类型定义了相同的方法,则存在歧义。 C#编译器要求你通过用new标记子类型方法来确认你想要这个 - 实际上说'是的我知道并且我想要隐藏基类型提供的方法'