Skip to content

How to Resolve Error "CS0412: parameter cannot have the same name as a method type parameter" in C#

Learn how to fix the C# compiler error CS0412 when a generic type parameter conflicts with a local variable, method parameter, or local function name in generic methods.

The Compiler Error CS0412 is a Naming Conflict error involving Generics. The message reads: "'name': a parameter, local variable, or local function cannot have the same name as a method type parameter".

In C#, when you define a Generic Method (e.g., void Method<T>), the identifier T becomes a placeholder for a Type (like int, string, or Customer). Within the scope of that method, T refers exclusively to that data type. If you try to declare a Variable, Parameter, or Local Function with the exact same name (T), you create an ambiguity: does T refer to the type definition or the specific data value?

To prevent this confusion, the compiler strictly forbids shadowing a generic type parameter with a local identifier.

Understanding Generic Shadowing

Consider a standard declaration: int x = 5;. int is the Type, x is the Value. You would never write int int = 5;.

When you write void Method<T>(), T acts exactly like int or string. It is a Type. Therefore, you cannot name a variable T inside that method, because you would be writing T T = value;.

Scenario 1: Parameter Name Conflict

This is common when developers use single-letter variable names or generic placeholders that happen to match standard argument names (like S, T, or V).

Example of error

You define a generic method taking type T, but you also name the input argument T.

public class DataHandler
{
    // ⛔️ Error CS0412: 'T': a parameter cannot have the same name 
    // as a method type parameter.
    // The <T> is the Type. The (string T) is the value. 
    // They cannot share the name.
    public void ProcessData<T>(string T)
    {
        // Ambiguity: Is 'T' the string variable or the generic type?
    }
}

Solution: Rename the Parameter

Follow standard C# naming conventions. Types should be PascalCase (often starting with T), and parameters should be camelCase.

public class DataHandler
{
    // ✅ Correct: 'T' is the type, 'input' (or 't') is the parameter.
    public void ProcessData<T>(string input)
    {
        System.Console.WriteLine(input);
    }
}

Scenario 2: Local Variable Conflict

This occurs when you declare a variable inside the method body that conflicts with the generic definition.

Example of error

public class Calculator
{
    public void Compute<T>()
    {
        // ⛔️ Error CS0412: 'T' cannot be a local variable name.
        int T = 100; 
        
        // If this were allowed, how would you cast to the type T?
        // object o = ...;
        // var result = (T)o; // Is this a cast to type <T> or a syntax error with variable T?
    }
}

Solution: Rename the Variable

Give the local variable a descriptive name.

public class Calculator
{
    public void Compute<T>()
    {
        // ✅ Correct: Distinct names.
        int threshold = 100; 
    }
}

Scenario 3: Local Function Conflict

With the introduction of Local Functions in C# 7.0, it is possible to define a small helper function inside a method. This function name is also subject to the same shadowing rules.

Example of error

public class Generator
{
    public void Build<T>()
    {
        // ⛔️ Error CS0412: Local function name 'T' conflicts with generic type 'T'.
        void T() 
        {
            // ...
        }

        T();
    }
}

Solution: Rename the Function

Use a name that describes the action of the local function.

public class Generator
{
    public void Build<T>()
    {
        // ✅ Correct
        void BuildHelper() 
        {
            // ...
        }

        BuildHelper();
    }
}

Conclusion

CS0412 is a clarity enforcement by the compiler. It ensures that the distinction between Types (blueprints) and Values (data) remains clear within your generic methods.

  1. Check <T>: Identify your generic type parameter name.
  2. Check Scope: Look for any parameters, variables, or functions named exactly the same thing.
  3. Rename: Change the variable/parameter name to be descriptive (camelCase), leaving the generic type as T (PascalCase).
Navigation