public Conversion MethodGroupConversion(SyntaxNode syntax, MethodGroup methodGroup, NamedTypeSymbol delegateType, ref HashSet <DiagnosticInfo> useSiteDiagnostics) { var analyzedArguments = AnalyzedArguments.GetInstance(); var result = OverloadResolutionResult <MethodSymbol> .GetInstance(); var delegateInvokeMethod = delegateType.DelegateInvokeMethod; Debug.Assert((object)delegateInvokeMethod != null && !delegateInvokeMethod.HasUseSiteError, "This method should only be called for valid delegate types"); GetDelegateArguments(syntax, analyzedArguments, delegateInvokeMethod.Parameters, Compilation); _binder.OverloadResolution.MethodInvocationOverloadResolution( methods: methodGroup.Methods, typeArguments: methodGroup.TypeArguments, receiver: methodGroup.Receiver, arguments: analyzedArguments, result: result, useSiteDiagnostics: ref useSiteDiagnostics, isMethodGroupConversion: true, returnRefKind: delegateInvokeMethod.RefKind, returnType: delegateInvokeMethod.ReturnType.TypeSymbol); var conversion = ToConversion(result, methodGroup, delegateType); analyzedArguments.Free(); result.Free(); return(conversion); }
/// <summary> /// The overload resolution portion of FindForEachPatternMethod. /// </summary> private MethodSymbol PerformForEachPatternOverloadResolution(TypeSymbol patternType, ArrayBuilder <MethodSymbol> candidateMethods, bool warningsOnly, DiagnosticBag diagnostics) { ArrayBuilder <TypeSymbol> typeArguments = ArrayBuilder <TypeSymbol> .GetInstance(); AnalyzedArguments arguments = AnalyzedArguments.GetInstance(); OverloadResolutionResult <MethodSymbol> overloadResolutionResult = OverloadResolutionResult <MethodSymbol> .GetInstance(); HashSet <DiagnosticInfo> useSiteDiagnostics = null; this.OverloadResolution.MethodInvocationOverloadResolution(candidateMethods, typeArguments, arguments, overloadResolutionResult, ref useSiteDiagnostics); diagnostics.Add(syntax.Expression, useSiteDiagnostics); MethodSymbol result = null; if (overloadResolutionResult.Succeeded) { result = overloadResolutionResult.ValidResult.Member; if (result.IsStatic || result.DeclaredAccessibility != Accessibility.Public) { if (warningsOnly) { diagnostics.Add(ErrorCode.WRN_PatternStaticOrInaccessible, syntax.Expression.Location, patternType, MessageID.IDS_Collection.Localize(), result); } result = null; } else if (result.CallsAreOmitted(syntax.SyntaxTree)) { // Calls to this method are omitted in the current syntax tree, i.e it is either a partial method with no implementation part OR a conditional method whose condition is not true in this source file. // We don't want to want to allow this case, see StatementBinder::bindPatternToMethod. result = null; } } else if (overloadResolutionResult.Results.Length > 1) { if (warningsOnly) { diagnostics.Add(ErrorCode.WRN_PatternIsAmbiguous, syntax.Expression.Location, patternType, MessageID.IDS_Collection.Localize(), overloadResolutionResult.Results[0].Member, overloadResolutionResult.Results[1].Member); } } overloadResolutionResult.Free(); arguments.Free(); typeArguments.Free(); return(result); }