Bird
Raised Fist0
C Sharp (C#)programming~5 mins

Generic class declaration in C Sharp (C#)

Choose your learning style10 modes available
Introduction

Generic classes let you create flexible blueprints that work with any type of data. This helps you reuse code without repeating it for each data type.

When you want a class to handle different types of data without rewriting it.
When building collections like lists or stacks that can store any type of item.
When creating utility classes that work with multiple data types safely.
When you want to avoid code duplication for similar classes that differ only by data type.
Syntax
C Sharp (C#)
class ClassName<T>
{
    // Members using T
}

T is a placeholder for any type you specify when using the class.

You can use any name instead of T, but T is a common convention.

Examples
A simple generic class Box that can hold any type of content.
C Sharp (C#)
class Box<T>
{
    public T Content;
}
A generic class with two type parameters to hold a pair of different types.
C Sharp (C#)
class Pair<T1, T2>
{
    public T1 First;
    public T2 Second;
}
A generic class with a constraint that T must be a reference type (class).
C Sharp (C#)
class Storage<T> where T : class
{
    public T Item;
}
Sample Program

This program creates a generic class Box that can hold any type. We make one box for integers and one for strings, then print their contents.

C Sharp (C#)
using System;

class Box<T>
{
    public T Content;

    public void ShowContent()
    {
        Console.WriteLine($"Content: {Content}");
    }
}

class Program
{
    static void Main()
    {
        Box<int> intBox = new Box<int>();
        intBox.Content = 123;
        intBox.ShowContent();

        Box<string> strBox = new Box<string>();
        strBox.Content = "Hello";
        strBox.ShowContent();
    }
}
OutputSuccess
Important Notes

Generic classes help avoid errors by checking types at compile time.

You can add constraints to limit what types can be used with your generic class.

Use descriptive names for type parameters if you have many, like TKey and TValue.

Summary

Generic classes let you write one class that works with any data type.

Use angle brackets <> to declare type parameters.

They improve code reuse and type safety.

Practice

(1/5)
1.

What is the main purpose of declaring a generic class in C# using <T>?

easy
A. To allow the class to work with any data type safely
B. To restrict the class to only one specific data type
C. To make the class run faster by avoiding type checks
D. To create multiple classes with different names automatically

Solution

  1. Step 1: Understand generic class purpose

    Generic classes use type parameters to work with any data type, improving code reuse and safety.
  2. Step 2: Compare options with generic concept

    Only To allow the class to work with any data type safely correctly states that generics allow safe use with any data type.
  3. Final Answer:

    To allow the class to work with any data type safely -> Option A
  4. Quick Check:

    Generic class purpose = safe, reusable code [OK]
Hint: Generics = flexible types for safe reuse [OK]
Common Mistakes:
  • Thinking generics restrict to one type
  • Believing generics improve speed by skipping checks
  • Confusing generics with automatic class creation
2.

Which of the following is the correct syntax to declare a generic class named Box with one type parameter?

?
easy
A. public class Box<T>() { }
B. public class Box<T> { }
C. public class Box(T) { }
D. public class Box[] { }

Solution

  1. Step 1: Recall generic class syntax

    Generic classes use angle brackets with type parameters: class ClassName<T>.
  2. Step 2: Check each option

    public class Box<T> { } matches correct syntax. Options A, B, and D have syntax errors or wrong symbols.
  3. Final Answer:

    public class Box<T> { } -> Option B
  4. Quick Check:

    Generic syntax = class Name<T> [OK]
Hint: Generic classes use angle brackets <> [OK]
Common Mistakes:
  • Using parentheses instead of angle brackets
  • Adding parentheses after class name
  • Using square brackets instead of angle brackets
3.

What will be the output of the following C# code?

public class Container<T> {
    public T Value;
    public Container(T value) { Value = value; }
    public override string ToString() => $"Value: {Value}";
}

var intBox = new Container<int>(10);
var strBox = new Container<string>("Hello");
Console.WriteLine(intBox);
Console.WriteLine(strBox);
medium
A. Value: 10 Value: Hello
B. Value: intBox Value: strBox
C. 10 Hello
D. Compilation error due to missing type constraints

Solution

  1. Step 1: Understand class behavior

    The class stores a value of type T and overrides ToString() to print "Value: {Value}".
  2. Step 2: Trace output of Console.WriteLine

    intBox.ToString() returns "Value: 10" and strBox.ToString() returns "Value: Hello".
  3. Final Answer:

    Value: 10 Value: Hello -> Option A
  4. Quick Check:

    ToString override prints value with prefix [OK]
Hint: ToString() shows formatted value, not variable name [OK]
Common Mistakes:
  • Expecting variable names instead of values
  • Ignoring ToString() override
  • Thinking type constraints are required here
4.

Identify the error in this generic class declaration and fix it:

public class Pair<T, U>
{
    public T First;
    public U Second;

    public Pair(T first, U second)
    {
        First = first;
        Second = second;
    }
}

var p = new Pair<string>(5, "test");
medium
A. Generic class cannot have two type parameters
B. Constructor parameters should be swapped
C. Missing type arguments when creating instance: use new Pair<int, string>(5, "test")
D. Fields First and Second must be private

Solution

  1. Step 1: Check instance creation syntax

    Generic classes require type arguments when instantiated unless using C# 7.1+ with target-typed new.
  2. Step 2: Identify missing type arguments

    The code uses new Pair<string>(5, "test") without specifying <int, string>, causing error.
  3. Final Answer:

    Missing type arguments when creating instance: use new Pair<int, string>(5, "test") -> Option C
  4. Quick Check:

    Generic instantiation needs type args [OK]
Hint: Always specify type parameters when creating generic instances [OK]
Common Mistakes:
  • Omitting type arguments on new
  • Thinking generic classes can't have multiple parameters
  • Changing constructor parameter order unnecessarily
5.

You want to create a generic class Cache<TKey, TValue> that stores key-value pairs and only allows reference types for TValue. Which declaration is correct?

hard
A. public class Cache<TKey, TValue> where TKey : struct { }
B. public class Cache<TKey, TValue> where TValue : struct { }
C. public class Cache<TKey, TValue> where TKey : class { }
D. public class Cache<TKey, TValue> where TValue : class { }

Solution

  1. Step 1: Understand type constraints

    To restrict a generic type to reference types, use where Type : class.
  2. Step 2: Apply constraint to TValue

    The question requires TValue to be a reference type, so constraint applies to TValue.
  3. Final Answer:

    public class Cache<TKey, TValue> where TValue : class { } -> Option D
  4. Quick Check:

    Reference type constraint = where TValue : class [OK]
Hint: Use 'where TValue : class' to restrict to reference types [OK]
Common Mistakes:
  • Applying constraint to wrong type parameter
  • Using 'struct' instead of 'class' for reference types
  • Omitting constraints when needed
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard