Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重新实现ObservableCollection。此[索引]_C#_Observablecollection - Fatal编程技术网

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
变量仍将使用基本实现。