Generics
Type Inference
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
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}");
}
}
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");static string Pair<T>(T left, T right)
pass 1 of 24{5 static string Pair<T>(T left3, T right7)6 {7 return left3 + "|" + right7;8 }numbers ← 3|7
12int right = 7; //@right=2, 913string numbers→ 3|7 = Pair(3, right7);14string words = Pair("red", "blue");static string Pair<T>(T left, T right)
pass 2 of 24{5 static string Pair<T>(T leftred, T rightblue)6 {7 return leftred + "|" + rightblue;8 }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
right ← 2
10static void Main()11{12 int right→ 2 = 2;13 string numbers = Pair(3, right2);14 string words = Pair("red", "blue");static string Pair<T>(T left, T right)
pass 1 of 24{5 static string Pair<T>(T left3, T right2)6 {7 return left3 + "|" + right2;8 }numbers ← 3|2
12int right = 2;13string numbers→ 3|2 = Pair(3, right2);14string words = Pair("red", "blue");static string Pair<T>(T left, T right)
pass 2 of 24{5 static string Pair<T>(T leftred, T rightblue)6 {7 return leftred + "|" + rightblue;8 }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
right ← 9
10static void Main()11{12 int right→ 9 = 9;13 string numbers = Pair(3, right9);14 string words = Pair("red", "blue");static string Pair<T>(T left, T right)
pass 1 of 24{5 static string Pair<T>(T left3, T right9)6 {7 return left3 + "|" + right9;8 }numbers ← 3|9
12int right = 9;13string numbers→ 3|9 = Pair(3, right9);14string words = Pair("red", "blue");static string Pair<T>(T left, T right)
pass 2 of 24{5 static string Pair<T>(T leftred, T rightblue)6 {7 return leftred + "|" + rightblue;8 }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