篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了foreach为什么找不到我的GetEnumerator扩展方法?相关的知识,希望对你有一定的参考价值。
我正在尝试使一些代码更具可读性。例如foreach(var row in table) ...
而不是foreach(DataRow row in table.Rows) ...
。
为此,我创建了一个扩展方法:
namespace System.Data
public static class MyExtensions
public static IEnumerable<DataRow> GetEnumerator( this DataTable tbl )
foreach ( DataRow r in tbl.Rows ) yield return r;
但是编译器仍然抛出foreach statement cannot operate on variables of type 'System.Data.DataTable' because 'System.Data.DataTable' does not contain a public definition for 'GetEnumerator'
。
为了确认我正确地实现了扩展方法,我改用了以下代码,编译器对此没有任何问题。
for ( IEnumerator<DataRow> enm = data.GetEnumerator(); enm.MoveNext(); )
var row = enm.Current;
...
在说这是因为未实现IEnumerator
或IEnumerator<DataRow>
之前,请考虑以下内容是否已编译:
public class test
public void testMethod()
foreach ( var i in new MyList( 1, 'a', this ) )
public class MyList
private object[] _list;
public MyList( params object[] list ) _list = list;
public IEnumerator<object> GetEnumerator() foreach ( var o in _list ) yield return o;
您的测试类中的GetEnumerator方法不是静态的,扩展方法是静态的。这也不会编译:
另一答案
您的测试类中的GetEnumerator方法不是静态的,扩展方法是静态的。这也不会编译:
另一答案
一些offtopic:如果您想使其更具可读性,请写
另一答案
您的扩展名等效于:
另一答案
在foreach语句中,编译器正在寻找GetEnumerator的实例方法。因此,类型(此处为DataTable)必须实现IEnumerable。它永远不会找到您的扩展方法,因为它是静态的。您必须在foreach中编写扩展方法的名称。
namespace System.Data
public static class MyExtensions
public static IEnumerable<DataRow> GetEnumerator( this DataTable table )
foreach ( DataRow r in table.Rows ) yield return r;
foreach(DataRow row in table.GetEnumerator())
.....
另一答案
当前通过扩展名将GetEnumerator添加到C#
https://github.com/dotnet/csharplang/issues/3194的建议
另一答案
foreach
中的对象集合必须实现
foreach
或
System.Collections.IEnumerable
。
如果您非常希望启用此功能,则可以创建一个包装类,该包装类实现System.Collections.IEnumerable
并具有指向您的指针System.Collections.Generic.IEnumerable<T>
。另外,您可以在新类中继承System.Collections.Generic.IEnumerable<T>
并实现IEnumerable
。
以上是关于foreach为什么找不到我的GetEnumerator扩展方法?的主要内容,如果未能解决你的问题,请参考以下文章