C# can often infer a generic type argument from method arguments.

type inference Type inference lets the compiler fill in a generic type argument.

Type Inference

right
TypeInference.cs
Replay: real traced execution (multi-file project)
using System;

class Program
{
    static string Pair<T>(T left, T right)
    {
        return left + "|" + right;
    }

    static void Main()
    {
        int right = 7;
        string numbers = Pair(3, right);
        string words = Pair("red", "blue");

        Console.WriteLine($"right={right}");
        Console.WriteLine($"numbers={numbers}");
        Console.WriteLine($"words={words}");
    }
}
using System;

class Program
{
    static string Pair<T>(T left, T right)
    {
        return left + "|" + right;
    }

    static void Main()
    {
        int right = 2;
        string numbers = Pair(3, right);
        string words = Pair("red", "blue");

        Console.WriteLine($"right={right}");
        Console.WriteLine($"numbers={numbers}");
        Console.WriteLine($"words={words}");
    }
}
using System;

class Program
{
    static string Pair<T>(T left, T right)
    {
        return left + "|" + right;
    }

    static void Main()
    {
        int right = 9;
        string numbers = Pair(3, right);
        string words = Pair("red", "blue");

        Console.WriteLine($"right={right}");
        Console.WriteLine($"numbers={numbers}");
        Console.WriteLine($"words={words}");
    }
}
  1. right ← 7

    10static void Main()11{12    int right→ 7 = 7; //@right=2, 913    string numbers = Pair(3, right7);14    string words = Pair("red", "blue");
  2. static string Pair<T>(T left, T right)

    pass 1 of 2
    4{5    static string Pair<T>(T left3, T right7)6    {7        return left3 + "|" + right7;8    }
  3. numbers ← 3|7

    12int right = 7; //@right=2, 913string numbers→ 3|7 = Pair(3, right7);14string words = Pair("red", "blue");
  4. static string Pair<T>(T left, T right)

    pass 2 of 2
    4{5    static string Pair<T>(T leftred, T rightblue)6    {7        return leftred + "|" + rightblue;8    }
  5. words ← red|blue

    13    string numbers = Pair(3, right);14    string words→ red|blue = Pair("red", "blue");1516    Console.WriteLine($"right={right7}");17    Console.WriteLine($"numbers={numbers3|7}");18    Console.WriteLine($"words={wordsred|blue}");19}
    outputright=7
    numbers=3|7
    words=red|blue
  1. right ← 2

    10static void Main()11{12    int right→ 2 = 2;13    string numbers = Pair(3, right2);14    string words = Pair("red", "blue");
  2. static string Pair<T>(T left, T right)

    pass 1 of 2
    4{5    static string Pair<T>(T left3, T right2)6    {7        return left3 + "|" + right2;8    }
  3. numbers ← 3|2

    12int right = 2;13string numbers→ 3|2 = Pair(3, right2);14string words = Pair("red", "blue");
  4. static string Pair<T>(T left, T right)

    pass 2 of 2
    4{5    static string Pair<T>(T leftred, T rightblue)6    {7        return leftred + "|" + rightblue;8    }
  5. words ← red|blue

    13    string numbers = Pair(3, right);14    string words→ red|blue = Pair("red", "blue");1516    Console.WriteLine($"right={right2}");17    Console.WriteLine($"numbers={numbers3|2}");18    Console.WriteLine($"words={wordsred|blue}");19}
    outputright=2
    numbers=3|2
    words=red|blue
  1. right ← 9

    10static void Main()11{12    int right→ 9 = 9;13    string numbers = Pair(3, right9);14    string words = Pair("red", "blue");
  2. static string Pair<T>(T left, T right)

    pass 1 of 2
    4{5    static string Pair<T>(T left3, T right9)6    {7        return left3 + "|" + right9;8    }
  3. numbers ← 3|9

    12int right = 9;13string numbers→ 3|9 = Pair(3, right9);14string words = Pair("red", "blue");
  4. static string Pair<T>(T left, T right)

    pass 2 of 2
    4{5    static string Pair<T>(T leftred, T rightblue)6    {7        return leftred + "|" + rightblue;8    }
  5. words ← red|blue

    13    string numbers = Pair(3, right);14    string words→ red|blue = Pair("red", "blue");1516    Console.WriteLine($"right={right9}");17    Console.WriteLine($"numbers={numbers3|9}");18    Console.WriteLine($"words={wordsred|blue}");19}
    outputright=9
    numbers=3|9
    words=red|blue