C# 如何重新实现ObservableCollection。此[索引]
以下操作无法按预期工作:C# 如何重新实现ObservableCollection。此[索引],c#,observablecollection,C#,Observablecollection,以下操作无法按预期工作:未打印名为“的派生代码。我是C#的新手,可能我错过了一些规则 多谢各位 class Test<T> : ObservableCollection<T>, IList<T>, IList { T IList<T>.this[int index] { get { Console.WriteLine("derived called"); return default(T); } set => thro
未打印名为“
的派生代码。我是C#的新手,可能我错过了一些规则
多谢各位
class Test<T> : ObservableCollection<T>, IList<T>, IList
{
T IList<T>.this[int index]
{
get { Console.WriteLine("derived called"); return default(T); }
set => throw new NotSupportedException();
}
object IList.this[int index]
{
get { Console.WriteLine("derived called"); return default(T); }
set => throw new NotSupportedException();
}
}
// ...
var t = new Test<int>() { 1 };
int i = t[0];
var oc = (ObservableCollection<int>)t;
int j = oc[0];
类测试:ObservableCollection、IList、IList
{
T IList.此[int索引]
{
获取{Console.WriteLine(“派生调用”);返回默认值(T);}
set=>抛出新的NotSupportedException();
}
对象IList。此[int索引]
{
获取{Console.WriteLine(“派生调用”);返回默认值(T);}
set=>抛出新的NotSupportedException();
}
}
// ...
var t=newtest(){1};
int i=t[0];
var oc=(可观测集合)t;
int j=oc[0];
似乎您应该使用ObservableCollection,您尝试的东西没有任何好处。此外,可观察到的收集元素已经存在,因此无需这样做
做你想做的事
public class Test<T> : ObservableCollection<T>
{
public new T this[int i]
{
get
{
Debug.WriteLine("yo");
return base[i];
}
set { base[i] = value; }
}
}
公共类测试:ObservableCollection
{
公共新技术[int i]
{
得到
{
Debug.WriteLine(“yo”);
返回基[i];
}
集合{base[i]=value;}
}
}
但是只需使用ObservableCollection您已经替换了IList实现,但您正在通过
ObservableCollection
访问它,并且您还没有覆盖该成员。@madreflection您能详细说明一下吗?我不明白。这里有两件事要指出。首先,正如Joe H的回答所暗示的,这个[int]
不是虚拟的,所以它不能被重写。阴影(new
)是您将获得的最佳效果。你想做的是不可能的,至少不是你想用的方式。其次,您需要了解接口成员的显式实现。他们如何与公众成员互动可能很复杂,也可能是一个深刻的主题,尤其是围绕着你试图做的事情。但是,因为第一件事,问题并不是这样的。关于阴影的一个注释是:一旦您转换到基类,Test
的静态类型信息(包括new t this[int i]
)将丢失,因此您必须使用t
变量来访问此属性;oc
变量仍将使用基本实现。