Skip to content

How to Resolve Warning "CS0649: Field is never assigned" in C#

Learn how to fix the C# compiler warning CS0649 when a field is never assigned, including solutions for dependency injection, Unity serialization, and logic bugs.

The Compiler Warning CS0649 is a code quality and logic warning. The message reads: "Field 'VariableName' is never assigned to, and will always have its default value null (or 0, false, etc.)".

This warning appears when you declare a private or internal field but never write code to assign a value to it (via a constructor, inline initialization, or method assignment). The compiler notices that you are reading from this field, but since it was never set, you are effectively reading a constant null (for classes) or 0 (for numbers), which typically indicates a bug or forgotten logic.

This guide explains why this occurs and how to handle scenarios involving dependency injection or serialization where the compiler might be "wrong".

Understanding Default Values

In C#, if a class-level field is not initialized, it automatically holds the default value for its type:

  • Reference Types (string, class): null
  • Numeric Types (int, float): 0
  • Boolean: false

If you write code that relies on _connectionString, but you never assigned a value to _connectionString, your code will crash with a NullReferenceException or fail silently. The compiler warns you of this impending failure.

Scenario 1: Forgotten Initialization (Logic Bug)

This is the most common cause. You created a field to hold data but forgot to pass the data into the constructor.

Example of Warning

public class Logger
{
    // ⛔️ Warning CS0649: Field '_prefix' is never assigned to...
    // It will always be null.
    private string _prefix;

    public void Log(string message)
    {
        // Logic bug: This prints "null: Hello" instead of a valid prefix.
        System.Console.WriteLine($"{_prefix}: {message}");
    }
}

Solution: Assign via Constructor

Ensure the field gets a value before it is used.

public class Logger
{
    private string _prefix;

    // ✅ Correct: The constructor assigns the value.
    public Logger(string prefix)
    {
        _prefix = prefix;
    }

    public void Log(string message)
    {
        System.Console.WriteLine($"{_prefix}: {message}");
    }
}

Scenario 2: Unity and Serialization (The False Positive)

This warning is extremely common in Unity game development or when using JSON serializers.

If a field is marked with an attribute like [SerializeField] (Unity) or [JsonProperty] (JSON), the value is injected by an external engine at runtime via Reflection. The C# compiler cannot see this runtime magic, so it thinks the field is never assigned.

Context (Unity Example)

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    // ⛔️ Warning CS0649: The compiler doesn't know Unity sets this via the Inspector.
    [SerializeField] 
    private float _speed; 

    void Update()
    {
        Move(_speed);
    }
}

Solution: Default Value or Suppression

To silence the warning, you can assign a default value (which will be overwritten by the engine) or use a null forgiving assignment (if available).

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    // ✅ Correct: Assigning a default value (e.g., 0f or a sensible default) silences the warning.
    [SerializeField] 
    private float _speed = 5.0f; 

    void Update()
    {
        Move(_speed);
    }
}

Solution: Assign, Initialize, or Delete

Depending on why the field is empty, choose one of these fixes:

1. Inline Initialization

If the value is constant or has a sensible default.

private int _retryCount = 3; // ✅ Correct

2. Constructor Initialization

If the value comes from outside dependencies.

public MyClass(IDependency dep)
{
    _dep = dep; // ✅ Correct
}

3. Delete Unused Field

If you check the code and realize you never meant to use the variable, simply delete it to clean up the code.

Conclusion

CS0649 is a helpful alert that your data might be missing.

  1. Check Logic: Did you forget to wire up a constructor parameter?
  2. Check Frameworks: Are you using Unity or Dependency Injection? If so, the warning is likely a false positive; assign a default value or suppress it.
  3. Check Relevance: If the field serves no purpose, delete it.
Navigation