A positional pattern lets you match an object by its position in a Deconstruct method or a record, checking its parts directly in a concise way.
Click to reveal answer
beginner
How do you use positional patterns with records in C#?
You write the record name followed by parentheses with variables to match each part, like: RecordName(var1, var2).
Click to reveal answer
intermediate
What method must a class have to support positional patterns?
It must have a Deconstruct method that outputs the parts you want to match.
Click to reveal answer
beginner
Example: How to match a Point record with positional pattern to get X and Y?
Use case Point(var x, var y): inside a switch or if to get X and Y values from the Point.
Click to reveal answer
intermediate
What happens if the number of variables in a positional pattern does not match the Deconstruct method?
The code will not compile because the pattern expects the exact number of parts to match.
Click to reveal answer
Which method enables positional patterns in a class?
AToString
BDeconstruct
CEquals
DGetHashCode
✗ Incorrect
The Deconstruct method defines how to split an object into parts for positional pattern matching.
How do you write a positional pattern for a record named Point with two parts?
APoint->(x, y)
BPoint[x, y]
CPoint{x, y}
DPoint(var x, var y)
✗ Incorrect
Positional patterns use parentheses with variables inside after the type name.
What will happen if you use fewer variables than the Deconstruct method parts in a positional pattern?
AIt throws runtime exception
BIt matches only the first parts
CCompilation error
DIt ignores extra parts
✗ Incorrect
The compiler requires the number of variables to match the Deconstruct method exactly.
Positional patterns are mainly used inside which C# construct?
Aswitch expressions
Bfor loops
Ctry-catch blocks
Dclass declarations
✗ Incorrect
Switch expressions commonly use positional patterns to match object parts.
Which C# feature introduced positional patterns?
AC# 9.0
BC# 7.0
CC# 8.0
DC# 10.0
✗ Incorrect
Positional patterns were introduced in C# 9.0 along with records.
Explain how positional patterns work with records and Deconstruct methods in C#.
Think about how you break down an object into pieces to check them.
You got /4 concepts.
Describe what happens if the number of variables in a positional pattern does not match the Deconstruct method.
Consider how strict the compiler is about matching parts.
You got /3 concepts.
Practice
(1/5)
1.
What is the main purpose of positional patterns in C#?
record Point(int X, int Y); Using case Point(var x, var y): inside a switch statement helps to:
easy
A. Extract values of X and Y from a Point object easily
B. Create a new Point object with given X and Y
C. Change the values of X and Y in the Point object
D. Call a method named Deconstruct on the Point object
Solution
Step 1: Understand positional pattern usage
Positional patterns allow matching an object and extracting its parts in one step, like case Point(var x, var y):.
Step 2: Identify what the pattern does with Point
It extracts the X and Y values from the Point object into variables x and y for use inside the case block.
Final Answer:
Extract values of X and Y from a Point object easily -> Option A
Quick Check:
Positional pattern extracts values [OK]
Hint: Positional patterns extract parts of an object [OK]
Common Mistakes:
Thinking positional patterns create or modify objects
Confusing Deconstruct method call with pattern matching
Assuming positional patterns only check types without extracting
2.
Which of the following is the correct syntax for using a positional pattern with a record Person(string Name, int Age) inside a switch expression?
switch(person) {
case ???:
// code
break;
}
easy
A. Person(var name, var age)
B. Person[name, age]
C. Person{name, age}
D. Person(name: name, age: age)
Solution
Step 1: Recall positional pattern syntax
Positional patterns use parentheses with variables: Type(var1, var2).
Step 2: Match syntax to options
Person(var name, var age) uses parentheses and variables correctly: Person(var name, var age). Others use invalid syntax for positional patterns.
Final Answer:
Person(var name, var age) -> Option A
Quick Check:
Positional pattern syntax uses parentheses [OK]
Hint: Positional patterns always use parentheses, not brackets or braces [OK]
Common Mistakes:
Using square brackets or curly braces instead of parentheses
Trying to use named arguments syntax inside patterns
Omitting var keyword or variable names
3.
What is the output of the following code?
record Point(int X, int Y);
var p = new Point(3, 4);
switch (p)
{
case Point(0, 0):
Console.WriteLine("Origin");
break;
case Point(var x, var y) when x == y:
Console.WriteLine("On diagonal");
break;
case Point(var x, var y):
Console.WriteLine($"Point at ({x}, {y})");
break;
}
medium
A. Origin
B. Point at (3, 4)
C. On diagonal
D. No output
Solution
Step 1: Check first case Point(0, 0)
p is (3,4), so it does not match (0,0).
Step 2: Check second case with condition x == y
x=3, y=4, so x != y; condition fails.
Step 3: Third case matches any Point and prints coordinates
It matches and prints "Point at (3, 4)".
Final Answer:
Point at (3, 4) -> Option B
Quick Check:
Pattern matches last case with output [OK]
Hint: Check cases top to bottom; first match runs [OK]
Common Mistakes:
Assuming (3,4) matches (0,0)
Ignoring the when condition in second case
Thinking no case matches and no output
4.
Identify the error in this code snippet using positional patterns:
record Rectangle(int Width, int Height);
var rect = new Rectangle(5, 10);
switch(rect)
{
case Rectangle(var w, var h):
Console.WriteLine($"Width: {w}, Height: {h}");
break;
case Rectangle(w, h):
Console.WriteLine("Invalid pattern");
break;
}
medium
A. Switch expression cannot use records
B. First case should use named arguments instead of positional pattern
C. Second case uses variables without var keyword, causing a syntax error
Variables in positional patterns must be declared with var or a type.
Step 2: Identify error in second case
Second case uses Rectangle(w, h) without var, which is invalid syntax.
Final Answer:
Second case uses variables without var keyword, causing a syntax error -> Option C
Quick Check:
Variables need var keyword in patterns [OK]
Hint: Always declare variables with var in positional patterns [OK]
Common Mistakes:
Omitting var keyword for variables in patterns
Thinking records can't be used in switch
Confusing named arguments with pattern variables
5.
Given the record Person(string Name, int Age), write a switch expression using positional patterns that returns:
"Child" if Age < 13
"Teen" if Age is between 13 and 19 inclusive
"Adult" otherwise
Which of the following switch expressions correctly implements this?
hard
A. person switch {
Person(_, var age) when age < 13 => "Child",
Person(_, var age) when age > 13 && age <= 19 => "Teen",
Person(_, _) => "Adult"
};
B. person switch {
Person(var name, var age) when age < 13 => "Child",
Person(var name, var age) when age > 13 && age < 19 => "Teen",
_ => "Adult"
};
C. person switch {
Person(var name, var age) when age <= 13 => "Child",
Person(var name, var age) when age >= 13 && age <= 19 => "Teen",
Person(var name, var age) => "Adult"
};
D. person switch {
Person(var name, var age) when age < 13 => "Child",
Person(var name, var age) when age >= 13 && age <= 19 => "Teen",
Person(var name, var age) => "Adult"
};
Solution
Step 1: Check age ranges and conditions
Child: age < 13, Teen: 13 ≤ age ≤ 19, Adult: otherwise.
Step 2: Analyze each option's conditions
person switch {
Person(var name, var age) when age < 13 => "Child",
Person(var name, var age) when age >= 13 && age <= 19 => "Teen",
Person(var name, var age) => "Adult"
}; correctly uses age < 13 for Child, age >= 13 && age <= 19 for Teen, and default Adult case. person switch {
Person(_, var age) when age < 13 => "Child",
Person(_, var age) when age > 13 && age <= 19 => "Teen",
Person(_, _) => "Adult"
}; misses age=13 (falls to Adult) because Teen condition uses > 13. person switch {
Person(var name, var age) when age < 13 => "Child",
Person(var name, var age) when age > 13 && age < 19 => "Teen",
_ => "Adult"
}; excludes age == 13 and 19 for Teen. person switch {
Person(var name, var age) when age <= 13 => "Child",
Person(var name, var age) when age >= 13 && age <= 19 => "Teen",
Person(var name, var age) => "Adult"
}; overlaps Child and Teen at age 13.
Step 3: Confirm the correct implementation
person switch {
Person(var name, var age) when age < 13 => "Child",
Person(var name, var age) when age >= 13 && age <= 19 => "Teen",
Person(var name, var age) => "Adult"
}; matches all conditions correctly and clearly.
Final Answer:
Option D code correctly implements the age groups -> Option D
Quick Check:
Check age ranges carefully in when clauses [OK]
Hint: Check boundary conditions carefully in when clauses [OK]
Common Mistakes:
Overlapping or missing age boundaries
Using _ wildcard instead of variables when needed
Incorrect logical operators in conditions
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.