private void CreateInitialProxies(MultiDictionary <Symbol, CSharpSyntaxNode> captured) { var typeMap = stateMachineClass.TypeMap; var orderedCaptured = from local in captured.Keys orderby local.Name, (local.Locations.Length == 0) ? 0 : local.Locations[0].SourceSpan.Start select local; foreach (var sym in orderedCaptured) { var local = sym as LocalSymbol; if ((object)local != null && (local.SynthesizedLocalKind == SynthesizedLocalKind.None || local.SynthesizedLocalKind == SynthesizedLocalKind.LambdaDisplayClass)) { // create proxies for user-defined variables and for lambda closures: Debug.Assert(local.RefKind == RefKind.None); MakeInitialProxy(typeMap, captured, local); continue; } var parameter = sym as ParameterSymbol; if ((object)parameter != null) { if (parameter.IsThis) { var proxyField = F.StateMachineField(method.ContainingType, GeneratedNames.ThisProxyName(), isPublic: true); variableProxies.Add(parameter, new CapturedToFrameSymbolReplacement(proxyField)); if (PreserveInitialParameterValues) { var initialThis = method.ContainingType.IsStructType() ? F.StateMachineField(method.ContainingType, GeneratedNames.StateMachineThisParameterProxyName(), isPublic: true) : proxyField; initialParameters.Add(parameter, new CapturedToFrameSymbolReplacement(initialThis)); } } else { var proxyField = F.StateMachineField(typeMap.SubstituteType(parameter.Type), parameter.Name, isPublic: true); variableProxies.Add(parameter, new CapturedToFrameSymbolReplacement(proxyField)); if (PreserveInitialParameterValues) { string proxyName = GeneratedNames.StateMachineParameterProxyName(parameter.Name); initialParameters.Add(parameter, new CapturedToFrameSymbolReplacement( F.StateMachineField(typeMap.SubstituteType(parameter.Type), proxyName, isPublic: true))); } if (parameter.Type.IsRestrictedType()) { // CS4013: Instance of type '{0}' cannot be used inside an anonymous function, query expression, iterator block or async method diagnostics.Add(ErrorCode.ERR_SpecialByRefInLambda, parameter.Locations[0], parameter.Type); } } } } }