Error del compilador CS0165

Actualización: Julio de 2008

Mensaje de error

Uso de la variable local no asignada 'nombre'
Use of unassigned local variable 'name'

El compilador de C# no permite el uso de variables no inicializadas. Si el compilador detecta el uso de una variable que pueda no haberse inicializado, genera el error CS0165. Para obtener más información, vea Campos (Guía de programación de C#). Tenga en cuenta que este error se genera cuando el compilador encuentra una construcción que podría dar como resultado el uso de una variable no asignada, incluso en el caso de que su código determinado no la utilice. Esto evita tener que utilizar reglas demasiado complejas para la asignación definitiva.

Si aparece este error

Para obtener más información, vea https://blogs.msdn.com/ericlippert/archive/2006/08/18/706398.aspx.

Ejemplo

El código siguiente genera el error CS0165:

// CS0165.cs
using System;

class MyClass
{
   public int i;
}

class MyClass2
{
   public static void Main(string [] args)
   {
      int i, j;
      if (args[0] == "test")
      {
         i = 0;
      }

      /*
      // to resolve, either initialize the variables when declared
      // or provide for logic to initialize them, as follows:
      else
      {
         i = 1;
      }
      */

      j = i;   // CS0165, i might be uninitialized

      MyClass myClass;
      myClass.i = 0;   // CS0165
      // use new as follows
      // MyClass myClass = new MyClass();
      // myClass.i = 0;
   }
}

El código siguiente produce el error CS0165 en Visual Studio 2008, pero no en Visual Studio 2005:

//cs0165_2.cs
class Program
{
    public static int Main()
    {
        int i1, i2, i3, i4, i5;

        // this is an error, because 'as' is an operator
       // that is not permitted in a constant expression.
        if (null as object == null)
            i1 = 1;

        // this is an error, because 'is' is an operator that
        //  is not permitted in a constant expression.
        // warning CS0184: The given expression is never of the provided ('object') type
        if (!(null is object))
            i2 = 1;

        // this is an error, because a variable j3 is not
        // permitted in a constant expression.
        int j3 = 0;
        if ((0 == j3 * 0) && (0 == 0 * j3))
            i3 = 1;

        // this is an error, because a variable j4 is not
        // permitted in a constant expression.
        int j4 = 0;
        if ((0 == (j4 & 0)) && (0 == (0 & j4)))
            i4 = 1;

        // this might be an error, because a variable j5 is not
        // permitted in a constant expression.
        // warning CS1718: Comparison made to same variable; did you mean to compare something else?
        int? j5 = 1;
        if (j5 == j5)
            i5 = 1;


        System.Console.WriteLine("{0}{1}{2}{3}{4}{5}", i1, i2, i3, i4, i5); //CS0165

        return 1;
    }

}

Este error se produce en definiciones de delegados recursivas y puede evitarse mediante la definición del delegado en dos instrucciones:

class Program
    {
        delegate void Del();
        static void Main(string[] args)
        {
            Del d = delegate() { System.Console.WriteLine(d); }; //CS0165
// Try this instead:
// Del d = null;
//d = delegate() { System.Console.WriteLine(d); };
            d();
        }
    }

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado texto y un ejemplo de código para los delegados recursivos.

Corrección de errores de contenido.