当前位置: 首页>>代码示例>>C#>>正文


C# ReadOnlyArray.AsReverseEnumerable方法代码示例

本文整理汇总了C#中ReadOnlyArray.AsReverseEnumerable方法的典型用法代码示例。如果您正苦于以下问题:C# ReadOnlyArray.AsReverseEnumerable方法的具体用法?C# ReadOnlyArray.AsReverseEnumerable怎么用?C# ReadOnlyArray.AsReverseEnumerable使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在ReadOnlyArray的用法示例。


在下文中一共展示了ReadOnlyArray.AsReverseEnumerable方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: SpillArgumentListInner

        private ReadOnlyArray<BoundExpression> SpillArgumentListInner(
            ReadOnlyArray<BoundExpression> arguments,
            ReadOnlyArray<RefKind> refKindsOpt,
            ArrayBuilder<SpillBuilder> spillBuilders,
            ref bool spilledFirstArg)
        {
            var newArgsBuilder = ArrayBuilder<BoundExpression>.GetInstance();

            var refKindIterator = refKindsOpt != null ? refKindsOpt.AsReverseEnumerable().GetEnumerator() : null;

            foreach (var arg in arguments.AsReverseEnumerable())
            {
                RefKind refKind = (refKindIterator == null) ? RefKind.None :
                    (refKindIterator.MoveNext()) ? refKindIterator.Current :
                    RefKind.None;

                if (arg.Kind == BoundKind.ArrayInitialization)
                {
                    // Descend into a nested array initializer:
                    var nestedInitializer = ((BoundArrayInitialization)arg);
                    var newInitializers = SpillArgumentListInner(nestedInitializer.Initializers, ReadOnlyArray<RefKind>.Empty, spillBuilders, ref spilledFirstArg);
                    newArgsBuilder.Add(nestedInitializer.Update(newInitializers));
                    continue;
                }

                if (arg.Kind == BoundKind.ArgListOperator)
                {
                    // Descend into arglist:
                    var argList = (BoundArgListOperator)arg;
                    var newArgs = SpillArgumentListInner(argList.Arguments, argList.ArgumentRefKindsOpt, spillBuilders, ref spilledFirstArg);
                    newArgsBuilder.Add(argList.Update(newArgs, argList.ArgumentRefKindsOpt, argList.Type));
                    continue;
                }

                var spillBuilder = new SpillBuilder();

                BoundExpression newExpression;
                if (!spilledFirstArg)
                {
                    if (arg.Kind == BoundKind.SpillSequence)
                    {
                        // We have found the right-most expression containing an await expression. Save the await
                        // result to a temp local
                        spilledFirstArg = true;
                        var spill = (BoundSpillSequence)arg;
                        spillBuilder.AddSpill(spill);
                        newExpression = spill.Value;
                    }
                    else
                    {
                        // We are to the right of any await-containing expressions. The args do not yet need to be
                        // spilled.
                        newExpression = arg;    
                    }
                }
                else
                {
                    // We are to the left of an await-containing expression. Spill the arg.

                    if (Unspillable(arg) ||
                        (arg.Kind == BoundKind.FieldAccess && Unspillable(((BoundFieldAccess)arg).ReceiverOpt)))
                    {
                        newExpression = arg;
                    }
                    else if (refKind != RefKind.None)
                    {
                        newExpression = SpillLValue(arg, spillBuilder);
                    }
                    else
                    {
                        var spillTemp = F.SpillTemp(arg.Type, arg);
                        spillBuilder.Temps.Add(spillTemp);
                        spillBuilder.Statements.Add(GenerateSpillInit(spillTemp));
                        newExpression = spillTemp;
                    }
                }

                newArgsBuilder.Add(newExpression);
                spillBuilders.Add(spillBuilder);
            }

            newArgsBuilder.Reverse();
            return newArgsBuilder.ToReadOnlyAndFree();
        }
开发者ID:EkardNT,项目名称:Roslyn,代码行数:84,代码来源:AwaitLoweringRewriterPass1_ArgExpressions.cs


注:本文中的ReadOnlyArray.AsReverseEnumerable方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。