nameof expression (C# reference)

A nameof expression produces the name of a variable, type, or member as the string constant:

Console.WriteLine(nameof(System.Collections.Generic));  // output: Generic
Console.WriteLine(nameof(List<int>));  // output: List
Console.WriteLine(nameof(List<int>.Count));  // output: Count
Console.WriteLine(nameof(List<int>.Add));  // output: Add

var numbers = new List<int> { 1, 2, 3 };
Console.WriteLine(nameof(numbers));  // output: numbers
Console.WriteLine(nameof(numbers.Count));  // output: Count
Console.WriteLine(nameof(numbers.Add));  // output: Add

As the preceding example shows, in the case of a type and a namespace, the produced name is not fully qualified.

In the case of verbatim identifiers, the @ character is not the part of a name, as the following example shows:

var @new = 5;
Console.WriteLine(nameof(@new));  // output: new

A nameof expression is evaluated at compile time and has no effect at run time.

You can use a nameof expression to make the argument-checking code more maintainable:

public string Name
{
    get => name;
    set => name = value ?? throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null");
}

Beginning with C# 11, you can use a nameof expression with a method parameter inside an attribute on a method or its parameter. The following code shows how to do that for an attribute on a method, a local function, and the parameter of a lambda expression:

[ParameterString(nameof(msg))]
public static void Method(string msg)
{
    [ParameterString(nameof(T))]
    void LocalFunction<T>(T param) { }

    var lambdaExpression = ([ParameterString(nameof(aNumber))] int aNumber) => aNumber.ToString();
}

A nameof expression with a parameter is useful when you use the nullable analysis attributes or the CallerArgumentExpression attribute.

C# language specification

For more information, see the Nameof expressions section of the C# language specification, and the C# 11 - Extended nameof scope feature specification.

See also