asignar c# non-nullable

asignar null a datetime c#



¿Por qué no se permite nulo para DateTime en C#? (6)

DateTime es un tipo de valor, igual que un int. Solo los tipos de referencia (como cadena o MyCustomObject) pueden ser nulos. Los tipos de referencia realmente almacenan "referencias" a la ubicación de los objetos en el montón.

aquí hay un article que encontré que lo explica mejor. y aquí está el artículo de MSDN en él

¿Por qué no está permitido asignar nulo a DateTime en C #? ¿Cómo se ha implementado esto? ¿Y se puede usar esta característica para hacer que sus propias clases no sean anulables?

Ejemplo:

string stringTest = null; // Okay DateTime dateTimeTest = null; // Compile error

Sé que puedo usar DateTime? en C # 2.0 para permitir que se asigne nulo a dateTimeTest y que podría usar la clase NonNullable de Jon Skeet en mi cadena para obtener un error de tiempo de ejecución en la asignación de stringTest. Me pregunto por qué los dos tipos se comportan de manera diferente.


DateTime es una estructura y no una clase. Haga una ''ir a definición'' o mírela en el navegador de objetos para ver.

HTH!


La distinción importante entre ValueTypes y tipos de referencia es que los tipos de valores tienen estas "semánticas de valores". Un DateTime, Int32 y todos los otros tipos de valores no tienen identidad, un Int32 "42" es esencialmente indistinguible de cualquier otro Int32 con el mismo valor.

Todos los "objetos" de tipo de valor existen en la pila o como parte de un objeto de tipo de referencia. Un caso especial es cuando lanzas una instancia de tipo de valor a un objeto o una interfaz; esto se llama "boxeo", y simplemente crea un objeto tipo referencia ficticio que solo contiene el valor que se puede extraer de nuevo ("unboxed") .

Los tipos de referencia, por otro lado, tienen una identidad. un "nuevo objeto ()" no equivale a ningún otro "nuevo objeto ()", porque son instancias separadas en el montón de GC. Algunos tipos de referencia proporcionan el método Equals y los operadores sobrecargados para que se comporten de forma similar a los valores, por ejemplo. una cadena "abc" es igual a otra cadena "abc" incluso si en realidad son dos objetos diferentes.

Entonces, cuando tiene una referencia, puede contener la dirección de un objeto válido o puede ser nula. Cuando los objetos de tipo de valor son todos cero, son simplemente cero. P.ej. un entero cero, un flotante cero, booleano falso o DateTime.MinValue. Si necesita distinguir entre "cero" y "valor perdido / nulo", necesita usar un indicador booleano separado o, mejor aún, utilizar la clase Nullable <T> en .NET 2.0. Que es simplemente el valor más un indicador booleano. También hay soporte en el CLR para que el boxeo de un Nullable con HasValue = falso resulte en una referencia nula, no en una estructura enmarcada con falso + cero, como lo haría si implementara esta estructura usted mismo.


Para que un tipo de valor sea nulo, debe haber algún valor que pueda contener que no tenga ningún otro significado legítimo, y que el sistema de alguna manera sepa que debe considerarse como "nulo" . Algunos tipos de valores podrían cumplir el primer criterio sin requerir ningún almacenamiento adicional. Si .net se diseñó desde cero con el concepto de valores anulables en mente, podría haber tenido Object include a virtual property, and a non-virtual IsLogicalNull Object include a virtual property, and a non-virtual IsNull property, and a non-virtual which would return true if is null and, otherwise invoke its IsLogicalNull property and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior and property and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior and constraint of estructural constraint of Nullable (an empty Nullable (an empty could be boxed as an empty Nullable could be boxed as an empty , and still be recognized as nulo).

En el momento en que se decidió proporcionar soporte para los tipos de valores que aceptan valores de null en .NET Framework 2.0, sin embargo, se había escrito una gran cantidad de código que suponía que los valores predeterminados para cosas como Guid y DateTime no se considerarían null . Dado que gran parte del valor en los tipos que aceptan null depende de su valor predeterminado predecible (es decir, null ), tener tipos que tenían un valor null , pero predeterminados a otra cosa, habría agregado más confusión que valor.


string es una clase, mientras que DateTime es una estructura. Es por eso que no puedes configurarlo como nulo


DateTime es un tipo de valor ( struct ), donde-como string es un tipo de referencia ( class etc.). Esa es la diferencia clave. Una referencia siempre puede ser nula; un valor no puede (a menos que use Nullable<T> - es decir, DateTime? ), aunque puede ser zero''d ( DateTime.MinValue ), que a menudo se interpreta como lo mismo que null (especialmente en 1.1).