public void ResolveOverloads()
{
var source = @"
using System;
class Program
{
static void M()
{
}
static void M(long l)
{
}
static void M(short s)
{
}
static void M(int i)
{
}
static void Main()
{
// Perform overload resolution here.
}
}";
var tree = SyntaxTree.ParseText(source);
var mscorlib = MetadataReference.CreateAssemblyReference("mscorlib");
var compilation = Compilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { mscorlib });
var model = compilation.GetSemanticModel(tree);
// Get MethodSymbols for all MethodDeclarationSyntax nodes with name 'M'.
IEnumerable<MethodSymbol> methodSymbols = tree.GetRoot()
.DescendantNodes().OfType<MethodDeclarationSyntax>()
.Where(m => m.Identifier.ToString() == "M")
.Select(m => model.GetDeclaredSymbol(m));
// Perform overload resolution at the position identified by the comment '// Perform ...' above.
var position = source.IndexOf("//");
OverloadResolutionResult<MethodSymbol> overloadResults = model.ResolveOverloads(
position, // Position to determine scope and accessibility.
ReadOnlyArray<MethodSymbol>.CreateFrom(methodSymbols), // Candidate MethodSymbols.
ReadOnlyArray<TypeSymbol>.Empty, // Type Arguments (if any).
ReadOnlyArray<ArgumentSyntax>.CreateFrom( // Arguments.
Syntax.Argument(
Syntax.LiteralExpression( // OR Syntax.ParseExpression("100")
SyntaxKind.NumericLiteralExpression, Syntax.Literal("100", 100)))));
Assert.IsTrue(overloadResults.Succeeded);
var results = string.Join("\r\n", overloadResults.Results
.Select(result => string.Format("{0}: {1}{2}",
result.Resolution, result.Member, result.IsValid ? " [Selected Candidate]" : string.Empty)));
Assert.AreEqual(@"Worse: Program.M(long)
Worse: Program.M(short)
ApplicableInNormalForm: Program.M(int) [Selected Candidate]", results);
}