虽然我正在制作一个逻辑来迭代两个不同类型的枚举,通过比较,我发现了这个:
class Program
{
public static IEnumerable<mm> YieldlyGet()
{
yield return new mm { Int = 0 };
yield return new mm { Int = 1 };
yield return new mm { Int = 2 };
yield return new mm { Int = 3 };
yield return new mm { Int = 4 };
yield return new mm { Int = 5 };
}
public static IEnumerable<int> YieldlyGetInt()
{
yield return 0;
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
}
public static IEnumerable<int> Get()
{
return new List<int> { 0, 1,2,3,4,5 };
}
static void Main(string[] args)
{
var yieldr = YieldlyGet().GetEnumerator();
var yieldv = YieldlyGetInt().GetEnumerator();
var list = Get().GetEnumerator();
int i = -1;
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
问题在于,当我在最后一个位置之后,列表向我显示默认值,而yield创建的Iterator,继续显示最后一个值.
对于当前指数:6
年:我应该下一步吗?假的,如果是,值:5
YV:我应该搬到下一个?假的,如果是,值:5
L:我应该搬到下一个?如果是,则为假,值:0
为什么?
根据该IEnumerator<T>.Current属性的MSDN文档:
Current未定义[when]:最后一次MoveNext返回的调用false,表示集合的结束.
这意味着枚举器的底层实现可以自由地从Current一次MoveNext返回返回任意值false.它可以是0,6,-1,2147483647,或者只是随机选取的值; 无论如何,你不应该使用它.
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |