2016-05-16 8 views
2

ich mithilfe der ToString-Methode ein Datetime in einen String der Form „c“, zu formatieren versuche:Keine Überlastung Methode für ToString dauert 2 Argumente

string end = evt.End.DateTime.ToString("c", DataController.culture); 

DataController.culture ist ein Verweis auf ein gültiges culture object und evt ist ein Ereignisobjekt aus der Google Kalender v3-API. Ich bin sicher, dass DateTime der DateTime-Klasse angehört, weil der Debugger dies in der Art des Objekts sagt.

Allerdings bekomme ich das Thema im Titel erwähnt, warum? Auch die MSDN docs zeigen, wie diese Methode zu verwenden, aber irgendwie kann ich nicht:

Console.WriteLine(date1.ToString("d MMMM", 
        CultureInfo.CreateSpecificCulture("es-MX"))); 
// Displays 29 agosto  
+2

Ändern Sie den Code in "evt.End.DateTime.GetType(). FullName". Wie lautet der vollständige Name des Typs, der Ihrer Meinung nach eine DateTime ist? –

+0

Beim Betrachten der Dokumente sind diese virtuell, was mich zu der Annahme verleitet, dass sie zum Zeitpunkt des Zugriffs tatsächlich unterschiedliche Typen sind https://developers.google.com/resources/api-libraries/documentation/calendar/v3/csharp /latest/classGoogle_1_1Apis_1_1Calendar_1_1v3_1_1Data_1_1EventDateTime.html – mckeejm

+0

Ich hatte nicht berücksichtigt, dass der Typ möglicherweise nullfähig ist. wie dumm von mir. Das würde das beobachtete Verhalten erklären, und der von mir vorgeschlagene Test - Drucken des Laufzeittyps - hätte das Problem im typischen Fall nicht angezeigt. (Weil GetType() entweder abstürzen würde, wenn der Wert null wäre, oder return typeof (DateTime), wenn dies nicht der Fall wäre.) –

Antwort

5

Die API documentation zeigt an, dass die Eigenschaft, die Sie ToString() sind versucht, ist eigentlich ein System.Nullable<DateTime>, die unterschiedlichen Verwendbarkeit Überlegungen von einer normalen DateTime hat. Um die ToString Methode, die Sie wünschen aufzurufen, benötigen Sie eine konkrete DateTime Struktur aus dem nullable ein zu Ihnen zur Verfügung gestellt abrufen - in Ihrem Fall, indem Sie folgendermaßen vorgehen:

string end = evt.End.DateTime.Value.ToString("c", DataController.culture); 

Wohlgemerkt, werden Sie normalerweise Überprüfen Sie zuerst, ob Ihr Nullable-Objekt (z. B. evt.End.DateTime) tatsächlich einen Wert aufweist, indem Sie die Eigenschaft HasValue überprüfen, bevor Sie ToString() oder eine andere Methode oder Eigenschaft aufrufen.

+0

Schöner Fang! Ich bemerke, dass Sie in C# 6 das Problem elegant mit dem NULL-fähigen Mitgliedszugriffsoperator lösen konnten. –

+0

Ich habe das tatsächlich versucht (ohne etwas über Nullable-Objekte zu wissen) und weil die IDE Value als Eigenschaft vorgeschlagen hat, bekomme ich jedoch einen "Operation nicht erlaubt" -Fehler oder etwas unter diesen Zeilen, liegt es daran, dass das Objekt zur Laufzeit null ist? Muss ich vorher etwas überprüfen? Auch ich bin neu in C#. – arielnmz

+0

Im Allgemeinen würde eine 'NullReferenceException' ausgelöst, wenn das Objekt tatsächlich null wäre. Könnten Sie Ihre Frage bitte mit dem Code aktualisieren, der den von Ihnen beschriebenen Fehler verursacht? –

Verwandte Themen