【发布时间】:2014-02-01 10:35:10
【问题描述】:
有时编译器无法推断变量类型。例如,如果我这样定义string 列表:
或字符串数组List:
显然编译器会推断项目的类型。但如果我这样做:
public class Foo
: IEnumerable
{
List<string> _fooRecords = new List<string>();
public IEnumerator GetEnumerator()
{
return _fooRecords.GetEnumerator();
}
}
或者这个:
public class Foo
: IEnumerable
{
List<string> _fooRecords = new List<string>();
public IEnumerator GetEnumerator()
{
foreach (var item in _fooRecords)
{
yield return item;
}
}
}
编译器无法推断变量类型:
然后我想也许我需要实现 IEnumerator 接口,我做了这样的事情:
public class FooEnumerator : IEnumerator
{
private List<string> recordsList;
private int index;
private string current;
public FooEnumerator(List<string> list)
{
recordsList = list;
}
public object Current
{
get { return current; }
}
public bool MoveNext()
{
if (index != recordsList.Count - 1)
{
current = recordsList[index];
index++;
return true;
}
return false;
}
public void Reset()
{
index = 0;
}
}
并像(在 Foo 类中)一样使用它:
public IEnumerator GetEnumerator()
{
return new FooEnumerator(_fooRecords);
}
但是什么都没有改变。现在我想知道为什么编译器不能推断自定义类型的循环变量类型?当然Foo 类只是一个例子,.NET Framework 中有许多自定义集合。例如ControlCollection 的Form 类:
当我循环浏览表单控件时,我不能这样做:
foreach (var item in this.Controls)
{
item.Name = "bla bla bla.."; //error
}
我需要指定类型或者我需要使用OfType扩展方法:
foreach (Control item in this.Controls)
{
item.Name = "bla bla bla.."; // OK!
}
foreach (var item in this.Controls.OfType<Control>())
{
item.Name = "bla bla bla.."; // OK!
}
现在我只是想知道真正的原因是什么,编译器不够聪明?或者在循环执行之前无法确定返回类型?
【问题讨论】:
-
您是否尝试过实现
IEnumerable<T>而不是IEnumerable?
标签: c# loops foreach type-inference