问题
如果我有一个定义如下的类:
public class TestList : ObservableCollection<TestClass>, IList<ITestInterface>, ICollection<ITestInterface>, IEnumerable<ITestInterface>, IEnumerable
我不能对此类的对象 使用IEnumerable
扩展方法(命名空间)。System.Linq
注意事项
- 中的
ObservableCollection
类型与集合接口中的类型不同,但TestClass
确实实现了ITestInterface
- 仍然可以
foreach
覆盖TestList
对象中的项目。这样做会给项目的类型TestClass
- 我确实在文件顶部有一个
using
声明System.Linq
这显然与 中的ObservableCollection
类型与类定义中的其他类型不同这一事实有关,但为什么呢?集合仍然可以在foreach
语句中枚举,这基本上就是那些扩展方法所做的(当然还有额外的逻辑)。
问题
为什么创建从一种类型的集合继承并实现另一种类型的集合接口的类会导致扩展方法System.Linq
无法在该类的对象上使用?
最小、完整和可验证的示例
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
var t = new TestList();
t.First(); //Extension method unavailable, compiler error
foreach (var item in t)
{
//item is of type TestClass
}
}
}
public interface ITestInterface { }
public class TestClass : ITestInterface { }
public class TestList : System.Collections.ObjectModel.ObservableCollection<TestClass>, IList<ITestInterface>, ICollection<ITestInterface>, IEnumerable<ITestInterface>, IEnumerable
{
//Method implementations are unnecessary for the example
ITestInterface IList<ITestInterface>.this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public bool IsReadOnly => throw new NotImplementedException();
public void Add(ITestInterface item) => throw new NotImplementedException();
public bool Contains(ITestInterface item) => throw new NotImplementedException();
public void CopyTo(ITestInterface[] array, int arrayIndex) => throw new NotImplementedException();
public int IndexOf(ITestInterface item) => throw new NotImplementedException();
public void Insert(int index, ITestInterface item) => throw new NotImplementedException();
public bool Remove(ITestInterface item) => throw new NotImplementedException();
IEnumerator<ITestInterface> IEnumerable<ITestInterface>.GetEnumerator() => throw new NotImplementedException();
}
}
背景
对于那些好奇的人,我在使用 Telerik RadGridView 控件 (WPF) 时遇到了这个问题。我试图在网格.First()
的属性上使用扩展方法,但是属性的类型有一个类似于我上面提供的类定义。Columns
Columns