Pregunta

Sé que esta es una pregunta tonta y supongo que debe haberse hecho antes. Sin embargo, no puedo encontrar una respuesta a mi pregunta.

Aquí hay algún código de muestra (que por supuesto no compila) para describir mi problema:

class test
{
     int[] val1;
     string val2;

     static bool somefunction(test x, test y)
     {
         dosomestuff()

         test result;

         while(result is nothing)
         {
              if(somecondition){result=new test(something);}
         }
     }
}

El problema que tengo está en la siguiente línea:

while(result is nothing)

Esta es la sintaxis de VB, que por supuesto no es lo que acepta el compilador C#. ¿Alguien podría decirme cómo resolver el problema?

¿Fue útil?

Solución

La sintaxis que estás buscando es:

while (result == null)

También tienes que configurar result = null; Para empezar también con

Otros consejos

  • Tl; dr:

    if (Object.Equals(myVariable, default(MyVariableType)))

    • Reemplazar myVariable y MyVariableType.


    Hay otras soluciones.


if (myVariable == null) voluntad no trabajo[1] con valor tipos. Los tipos de valor son principalmente structS (por ejemplo DateTime), incluido[2] la tipos simples me gusta int, y enumeraciones. Los tipos de valor no admiten un null valor (intrínsecamente).

La excepción y la solución a esto son anulable Tipos: esencialmente estos agregan null a los posibles valores de un tipo de estructura. Son estructuralmente lo mismo que el Maybe<T> Puede que sepas de otros idiomas[3]. Los creas con ValueType? (p.ej int?) que es azúcar sintáctica para Nullable<ValueType>.


Alternativamente, en lugar de usar un tipo anulable, puede comparar su variable con el valor predeterminado de su tipo:

if (Object.Equals(myVariable, default(MyVariableType)))

(Esto funcionará tanto para los tipos de referencia (objetos) como para los tipos de valor).
Tenga en cuenta que tiene que reemplazar MyVariableType Manualmente, desafortunadamente puedes no hacer

if (Object.Equals(myVariable, default(myVariable.GetType())))

porque default() Solo acepta un nombre de tipo directamente. (Supongo que se evalúa en el tiempo de compilación).


estructuras en una palabra

En pocas palabras, las estructuras son clases reducidas. Imagine clases que no admiten herencia o finalizadores, y usted tiene la versión reducida: la estructura. Las estructuras se definen de la misma manera que las clases (excepto con el struct Palabra clave), y aparte de las limitaciones que se acaba de describir, las estructuras pueden tener los mismos miembros ricos, incluidos campos, métodos, propiedades y operadores.
Citado de: http://www.albahari.com/valuevsreftypes.aspx ]

Las clases son tipos de referencia: Una variable de clase (o más específicamente, su área de memoria) solo contiene un puntero a otra área de memoria, donde se almacenan los datos de instancia de objeto real.

Tipo de valor Las variables contienen directamente los datos. Esto puede generar un beneficio de velocidad debido a localidad de caché y guardar la búsqueda. Pero también puede ser perjudicial para el rendimiento en el caso de estructuras más complejas.



Notas al pie:

1] Ni siquiera arroja un error. myVariable == null siempre solo cederá false, porque su myVariable se inicializará con el nonull defecto valor (cero (equivalente) o una estructura de ceros y nulls). Este valor predeterminado está disponible con default(Type).

2] técnicamente los tipos simples (todos tipos incorporados excepto string y object) son estructuras. Nota al margen: los tipos incorporados son alias para tipos de la Sistema espacio de nombres.

3] Por ejemplo en Haskell. Cía# Maybe<T> no está incorporado, pero se puede implementar. Proporciona Nothing como una versión más explícita/autocompletadora de null tanto para clases como para estructuras.

4] No hay [4]. No, realmente, puedes ir y verificar.

while (result == null)
while (result ==null )

Si eso es lo que quieres decir

Aunque tiene una respuesta con la que está contento, hay algo detrás de esto, puede que encuentre interesante o útil.

Hay una diferencia entre C# y VB.NET. En vb.net puedes escribir:

Dim b as Boolean

Y en C# puedes escribir:

bool b;

Son sutilmente diferentes. En vb.net, b se le ha dado el valor falso (en otras palabras, ya se ha inicializado). Cía#, b no tiene valor (no está inicializado). C# se esfuerza mucho para asegurarse de que no puede examinar el valor de una variable que nunca se ha inicializado.

Por lo tanto, no está probando si la variable se inicializa. En VB.NET no existe una variable no inicializada. En C# es imposible obtener el valor de una variable no inicializada para compararla con cualquier cosa.

Está probando si la variable se ha inicializado para null o Nothing.

while(result == null)

El equivalente de nada en C# es nulo.

while (result == null)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top