Search code examples
c#initializationdefaultintdefault-value

Why do I have to assign a value to an int in C# when defaults to 0?


This works:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

But this gives a compiler error ("Use of unassigned local variable 'a'"):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

As far as I can tell this happens because in the first example, technically, the compiler doesn't know that 'a' is not assigned. In the latter example, 'a' is defined locally, and therefore is easy to track.

But why does the latter example not work?

Don't integers default to 0? Is this something the compiler enforces for "best practices". Or is there another reason?


Solution

  • In the first example it is a field. Fields automatically default to 0/false/null. In the second example it is a variable. Variables are not defaulted, and must have "definite assignment" before they are used.

    Essentially, when creating an object (or initializing a struct) it zeros the memory (or in the case of a non-default struct ctor, forces you to manually initialize everything). However, variables are so common (in every method) that it doesn't want the overhead of having to zero the stack all the time. It instead forces you to indicate the initial value.