Как я могу установить system.nullable для datetime в качестве необязательного параметра в подпрограмме?

#c# #.net #vb.net

#c# #.net #vb.net

Вопрос:

Я попробовал следующее, но получаю ошибку

требуется постоянное выражение

 Public Sub ExampleSub(ByVal Test as string, 
  Optional ByVal fromDate As System.Nullable(Of DateTime) = Date.Today)
'A Great sub!
End sub
  

и вот C#

 public void ExampleSub(string Test, 
  System.Nullable<DateTime> fromDate = System.DateTime.Today)
{
    //A Great sub!
}
  

Заранее спасибо

Комментарии:

1. Это греческий эквивалент.. Также может быть «подпроцедура» 🙂

Ответ №1:

Вы не можете использовать непостоянное выражение для параметра по умолчанию. System.DateTime.Today будет зависеть от того, когда вы запускаете программу, поэтому оно не является постоянным.

Используйте постоянное выражение по умолчанию, а затем проверьте это и установите fromDate на System.DateTime.Now в подпрограмме. Обычно null используется в качестве специального значения, как в ответе @sehes. Если null в вашем коде есть другое специальное значение, вы могли бы использовать значение, которое никогда не будет использоваться в качестве параметра defaul, например System.DateTime.MinValue :

 public void ExampleSub(string Test, 
  System.Nullable<DateTime> fromDate = DateTime.MinValue)
{
    fromDate = fromDate == DateTime.MinValue ? System.DateTime.Now : fromDate;
    //A Great sub!
}
  

Ответ №2:

Вы не можете, компилятор скажет вам, почему 🙂

в C#:

 public void ExampleSub(string Test)
{
    //A Great overload!
    ExampleSub(Test, System.DateTime.Now);
}

public void ExampleSub(string Test, System.Nullable<DateTime> fromDate)
{
    //A Great sub!
}
  

Теперь, если вы знаете, что null это не будет законно передано вызывающим, вы могли бы сделать:

 public void ExampleSub(string Test, System.Nullable<DateTime> fromDate = null)
{
    fromDate = fromDate?? System.DateTime.Now;
    //An Even Greater sub!
}
  

Комментарии:

1. Я попробовал ваше решение (в Vb.NET ) и теперь я получаю ошибку BC31405: необязательные параметры не могут иметь типы структуры. Пожалуйста, есть идеи?

2. @Chocol8: ммм, не уверен. Моим примером был C #, и он обязательно компилируется на C #: ideone.com/NJ4yk

Ответ №3:

VB

 Public Sub ExampleSub(Test As String, _
                      Optional fromDate As System.Nullable(Of DateTime) = Nothing)
    'A Great sub!
    If fromDate Is Nothing Then
        'code here for no fromDate
        'i.e. Now
        fromDate = DateTime.Now
    End If
End Sub
  

Комментарии:

1. Я попробовал это, ошибка: необязательные параметры не могут иметь типы структуры.

2. @openandfree — Какую версию вы используете?

3. Я использую 3.5, хотя я решил это как: Необязательно использовать TimeSlotDate как DateTime = Ничего

Ответ №4:

Если кто-то делает это в VB.Net это способ, которым я решил свою проблему, я не нашел точную вещь в этом потоке, если это кому-то поможет:

   /*I set below line as parameter in method*/
  Optional ByVal SlotDate As DateTime = Nothing

  If Not SlotDate = Nothing Then
       /* code to execute when date passed */
  Else
       /* code to execute when there is no date passed */
  End If