Skip to main content

How to Resolve Error "CS0307: The 'construct' 'identifier' is not a generic method" in C#

The Compiler Error CS0307 is a syntax error related to Generics. The message reads: "The property 'Name' (or field/variable) is not a generic method. If you intended an expression list, use parentheses around the < expression."

In C#, angle brackets <T> are used to supply type arguments to Generic Methods or Generic Classes. This error occurs when you apply these brackets to a member that does not support them, such as a Property, a Field, or a Variable. Essentially, you are trying to "configure" a type for something that is just a simple value.

This guide explains why this syntax mismatch occurs and how to correct it.

Understanding Generic Syntax​

Generic syntax allows you to specify types for methods that are designed to handle various data types.

  • Valid: myList.Select<int>(...) (Select is a generic method).
  • Invalid: myList.Count<int> (Count is a property, simply an integer).

When the compiler sees identifier<T>, it expects identifier to be a method defined like void Method<T>(). If identifier is actually a property (like List.Count), the compiler gets confused. It tells you it's "not a generic method" and suggests you might be trying to do a "Less Than" comparison (e.g., Count < 5), hence the confusing advice about "expression lists."

Scenario 1: Using Generics on Properties​

This is the most common cause. Developers often get used to LINQ syntax (like .Select<T>() or .Cast<T>()) and accidentally apply the same syntax to standard properties like .Count or .Length.

Example of error​

Attempting to specify a type for the Count property of a list.

using System.Collections.Generic;

public class Program
{
static void Main()
{
List<string> names = new List<string> { "Alice", "Bob" };

// ⛔️ Error CS0307: The property 'List<string>.Count' is not a generic method.
// 'Count' is just an integer. It doesn't need to know about 'int' or 'string'.
int count = names.Count<int>();
}
}

Solution: Remove Type Arguments​

Properties are values, not methods. Simply access the property name.

using System.Collections.Generic;

public class Program
{
static void Main()
{
List<string> names = new List<string> { "Alice", "Bob" };

// ✅ Correct: Just access the property.
int count = names.Count;

System.Console.WriteLine(count);
}
}
note

Why the error mentions "expression list": The compiler sees names.Count < int. It thinks you might be trying to check if names.Count is less than a variable named int. Since int is a type, this logic falls apart, resulting in the confusing suggestion to use parentheses.

Scenario 2: Using Generics on Non-Generic Methods​

You might try to pass a type argument to a method that looks like it should be generic, but isn't. This often happens with older libraries or methods that operate on object.

Example of error​

The ToString() method exists on every object, but it is not generic.

public class Data
{
public int Id { get; set; }
}

public class Program
{
static void Main()
{
var d = new Data();

// ⛔️ Error CS0307: The method 'ToString' is not a generic method.
// You cannot customize ToString by passing a type.
string s = d.ToString<string>();
}
}

Solution: Remove Brackets​

Use the method as defined.

public class Program
{
static void Main()
{
var d = new Data();

// ✅ Correct: Standard method call
string s = d.ToString();
}
}

Conclusion​

CS0307 is a syntax error indicating misplaced angle brackets < >.

  1. Check the Member: Hover over the identifier (e.g., Count, ToString).
  2. Is it a Property? Properties never take type arguments. Remove <T>.
  3. Is it a Method? Check the definition. If it is defined as void Method(), you cannot call it as Method<T>(). Remove <T>.