接口默认索引器实现未生效咨询:为何类未自动使用默认实现?
接口默认索引器实现的问题解析
问题根源
C# 中接口的默认实现不会自动成为实现类的公共成员。当Foo类实现IFoo但未显式声明索引器时,接口的默认索引器逻辑仅关联到IFoo接口类型本身,并不会被自动添加到Foo类的公共成员列表里。因此直接用Foo实例调用索引器时,编译器找不到对应的成员,就会抛出Cannot apply indexing to an expression of type 'Baz.Foo'错误。
解决方法
要调用到接口的默认索引实现,有两种可行方式:
- 将
Foo实例显式转换为IFoo接口类型后调用:var foo = new Foo(); var value = ((IFoo)foo)[0]; - 在
Foo类中显式实现接口索引器,并复用默认逻辑:public class Foo : IFoo { // 显式实现接口索引器,直接调用默认实现 object IFoo.this[int index] => base[index]; }
如果想让索引器成为Foo类的公共成员,还可以定义类自己的索引器并调用接口默认实现:
public class Foo : IFoo { public object this[int index] => ((IFoo)this)[index]; }
接口默认索引器实现的意义
- 保证接口向后兼容:当给已广泛使用的接口新增索引器时,无需强制所有实现类都修改代码适配,老实现类可以直接通过接口类型使用默认逻辑,避免大量代码变更。
- 提供通用逻辑复用:对于不需要自定义索引器逻辑的实现类,无需重复编写相同代码,直接借助接口的默认实现即可,但必须通过接口类型或显式引用的方式访问。
内容的提问来源于stack exchange,提问作者Charles Burns
相关产品推荐
相关产品推荐

