Systeem.DateTime? vs Systeem.Datum / tijd

Ik aan het schrijven was aan een aantal code waar ik dat nodig is om te lezen waarde voor de datum van een Kalender besturings element in mijn pagina (Ajax toolkit: agenda-extender).

De code hieronder in:

DateTime newSelectedDate = myCalendarExtender.SelectedDate;

geeft de volgende foutmelding:

Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)

Echter, door het plaatsen van een gegoten kan ik de code te werk:

DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; //works fine!

De ‘SelectedDate’ eigendom voor de agenda control (Ajax toolkit) beschrijft het type gegevens dat als ‘Systeem.DateTime?’ … duidelijk de ‘?’ iets te doen met dit alles.

Wat er precies gebeurt wanneer een gegevenstype bevat dit symbool (?)… Ik vermoed dat ik dat kon toepassen van de ‘SelectedDate’ materiële recht in een variabele van het type ‘DateTime’ zonder casting.

Dankzij

InformationsquelleAutor Dal | 2009-11-13



6 Replies
  1. 46

    ? betekent dat het type is null-waarden. Voor details, zie bijvoorbeeld MSDN

    Null-waarden is een compiler-ondersteund wrapper rond value types die het mogelijk maakt de waarde typen nietig.

    Om toegang te krijgen tot de DateTime-waarde, moet u het volgende doen:

    DateTime? dateOrNull = myCalendarExtender.SelectedDate;
    if (dateOrNull != null)
    {
        DateTime newSelectedDate = dateOrNull.Value;
    }
    • u liever de rauwe url? Mijn excuses voor het bewerken dan.
    • Hij voegde de code blok in zijn bewerkt, dus het meest waarschijnlijk was het niet een opzettelijke verandering… gewoon dat hij al het edit-scherm geopend, voorafgaande aan het bewerken.
    • Sorry, het was onbedoeld. Ik wist niet dat u bewerkt de url, mijn bewerken overschrijft de jouwe.
    • Oef, ik was niet zeker of dat soort dingen was of niet. 😀
    • Dank aan iedereen die antwoordde, het maakt soo veel meer zin nu! 🙂
    • FYI, dit is ook geldig in VB.NET nu is. nu hoeven we niet te schrijven Dim SomeCrap as Nullable(Of Integer), we hebben gewoon te schrijven Dim SomeCrap as Integer?

  2. 22

    DateTime? is hetzelfde als Nullable<DateTime>
    Dat is: een exemplaar van DateTime? kan bevatten ‘NULL’, terwijl een exemplaar van DateTime niet.
    (Dit geldt voor alle waarde – types sinds .NET 2.0. Een Waarde kan niet NULL bevatten , maar, zoals uit .NET 2.0, null-waarden waarde typen worden ondersteund via de Nullable<T> bouwen (of het ? steno).

    Kunt u de waarde van DateTime? en zet het in DateTime door dit te doen:

    DateTime? someNullableDate;
    DateTime myDate;
    
    if( someNullableDate.HasValue )
       myDate = someNullableDate.Value;

    Een ander, conciser manier om de waarde van een null-waarden door gebruik te maken van de null-samen operator:

    DateTime myDate = someNullableDate?? default(DateTime);
    • Dit is een veel mooiere oplossing dan het antwoord.
  3. 10

    Een veel betere oplossing en IMO de beste eigenschap van alle met de null-waarden klasse

    DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
    • Ik zou zeggen dit is de veel nette oplossing.
  4. 9

    Het Kalender besturings element retourneert een null-waarden<DateTime> (steno in C# is DateTime?) in de SelectedDate Goederen, sinds DateTime een struct. De null-waarde kan de Controle te hebben “geen datum geselecteerd” staat. Dus, moet u controleren of de null-waarden een waarde heeft voordat u het kunt gebruiken.

    var null-waarden = myCalendarExtender.SelectedDate; 
    var newSelectedDate = (null-waarden.HasValue) ? null-waarden.Waarde : SomeDefaultValue; 
    

    EDIT: Nog meer beknopte, dankzij Josh ‘ s reactie:

    var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue; 
    

    Ik het graag!

    • U kunt vereenvoudigen dit met het volgende: var newDate = null-waarden ?? someDefault;
    • ja, gebruik dan ‘??’, dit is de reden waarom we het hebben.
    • Of je kan het overslaan van het bestaan de moeite van jezelf als mijn antwoord.
    • Ik ben het eens; echter, soms wil ik niet naar de standaard waarde van een waarde van het type zoals DateTime… misschien wil ik DateTime.Vandaag als mijn standaard in de evaluatie.
  5. 2

    Kunt u gebruik maken van het ?? operator om te werken met nullables op een zeer beknopte wijze in C#. Zie mijn reactie op Theo ‘ s antwoord voor een kortere manier van uitdrukken van de “als niet leeg, gebruik het dan anders gebruik maken van een aantal standaard waarde” concept. Ze beide hetzelfde doen.

  6. -1
    var Endtime = DateTime.Now();
    DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;

    Betekent: het type item.item.REPORT_TIME is het systeem.DateTime?

    howerver het type van de begintijd is het systeem.DateTime;
    dus de code kan veranderd zoals

    `var Eindtijd=DateTime.Nu;
    var startTime=item.REPORT_TIME.HasValue?Zetten.ToDateTime(post.REPORT_TIME.HasValue):Eindtijd

    `

    • Kunt u de opmaak van uw code en uitleggen met meer details?
    • dit is de eerste keer dat het antwoord geven ,ik zal het veranderen.dank je voor je advies.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *