2011-07-28 4 views
25

Chciałem mieć opcjonalny parametr daty dla metody (domyślnie MinValue), aby sprawdzić, czy użytkownik rzeczywiście podał wartość, czy nie (podając wartość MinValue była nieprawidłowa), ale nie wolno mi tego, ponieważ podobno to nie jest stała czasu kompilacji.C# - Dlaczego DateTime.MinValue i MaxValue nie są stałymi w czasie kompilacji?

Zgodnie z the MSDN page, "Wartość tej stałej jest równoważna 00: 00: 00.0000000, 1 stycznia 0001."

Dlaczego więc nie jest to stała czasu kompilacji? I dlaczego różni się od przekazywania wartości Int32.MinValue, która jest dozwolona?

+0

@Downvoter Dlaczego upadł? Czułem, że pytanie było jasne, miało precyzyjną odpowiedź i było istotne dla strony. – Alex

Odpowiedz

23

Nie można zdefiniować stałej DateTime (lub structs). Z MSDN dozwolonymi typami dla const są:

Jeden z typów: bajt, char, short, int, long, float, double, decimal, bool, string, typ wyliczeniowy lub typ odniesienia.

+1

dzięki, to odpowiada na moje aktualne pytanie! – Alex

+1

@jazmatician DateTime _jest_ typem wartości. Zobacz http://msdn.microsoft.com/en-us/library/system.datetime(vsv1.110).aspx – Vasea

+0

Wiedziałem, że to źle, kiedy pisałem, ale nie mogłem tego położyć. :) –

12

Obejście problemu: Użyj parametru nullable jako parametru. IMO jest to czyściejsze, ponieważ wartość specjalna jest wyraźnie inna, a nie tylko wartość normalna.

void A(DateTime? p=null) 
{ 
} 

Inną alternatywą jest:

void A(DateTime p=default(DateTime)) 
{ 
} 

który pokazuje, że parametr domyślny można używać default(T) jako poprawną wartość domyślna parametru dla typów zdefiniowanych przez użytkownika.

Albo po prostu przeciąż metodę dla różnej liczby parametrów.

+0

to odpowiada na moje domniemane pytanie "jak mogę zrobić to, co próbuję zrobić?", Dzięki :) – Alex

+0

Możesz spróbować użyć ['readonly'] (http://msdn.microsoft.com/en- us/library/acdd6hb7 (v = vs.71) .aspx), jeśli chcesz mieć pewność, że wartość się nie zmieni. Wierzę, że można to wykorzystać w połączeniu z typem zerowym ['?'] (Http://msdn.microsoft.com/en-us/library/1t3y8s4s (v = vs.80) .aspx). – eternalmatt

+0

@eternalmatt Nie śledzę - jak to pomaga mieć opcjonalny parametr DateTime? Jeśli jest to opcjonalne, będzie potrzebować wartości domyślnej, a ponieważ nie mogę zapewnić stałej czasu kompilacji, wydaje mi się, że rozwiązanie CodeInChaos jest najlepsze. – Alex