2015-04-20 8 views
5

Questo non è così banale come sembra. È un seguito di this question.Come scrivere [DefaultValue (null)] in VB.NET? <DefaultValue (Nothing)> non compila

Diciamo che ho un controllo Windows Form utente con una proprietà:

// using System.ComponentModel; 

[DefaultValue(null)] 
public object DataSource { … } 

Se traduco questo per VB.NET, vorrei provare questo:

'Imports System.ComponentModel 

<DefaultValue(Nothing)> 
Public Property DataSource As Object 
    … 
End Property 

Questo non funziona perché il compilatore ha problemi a scegliere il corretto overload of DefaultValueAttribute's constructor:

Risoluzione di sovraccarico non riuscita perché non accessibile New è più specifico per questi argomenti:

  • Public Sub New(value As Boolean): Non molto specifico.
  • Public Sub New(value As Byte): non molto specifico.
  • Public Sub New(value As Char): non molto specifico.

Sono abbastanza sicuro che questo è dovuto al fatto Nothing in VB.NET non solo significa "il riferimento null" (null in C#), ma anche "il valore di default per" il tipo di parametro (default(T) in C#) . A causa di questa ambiguità, ogni sovraccarico del costruttore è una potenziale corrispondenza.

<DefaultValue(CObj(Nothing))> inoltre non funzionerà perché non è un valore costante.

Come esattamente do Scrivo questo in VB.NET?

P.S .:<DefaultValue(GetType(Object), Nothing)> è un'opzione, ma elude il problema. Sono davvero interessato se c'è un modo per utilizzare lo stesso costruttore per DefaultValueAttribute come fa la versione C#.

risposta

5

"[...] non funzionerà perché il compilatore ha problemi scegliendo la corretta sovraccarico DefaultValueAttribute 's costruttore [.]"

il compilatore può essere assistita con un tipo-cast di Nothing al tipo desiderato: "<DefaultValue(CObj(Nothing))> anche non funzionerà in quanto non è un valore costante"

<DefaultValue(DirectCast(Nothing, Object))> 

Fortunatamente, a differenza CObj(Nothing), il compilatore considera DirectCast(Nothing, Object) — e sorprendentemente, CType(Nothing, Object), troppo — un valore costante, quindi è accettato.

+2

@Stack se si desidera avere lo stesso codice di C#, è necessario eseguire il cast in String :-) Vedere http://goo.gl/iP3N7e '. Istanza personalizzata void [Sistema] System.ComponentModel.DefaultValueAttribute :: .ctor (string) ' – xanatos

+1

Il casting in stringa ha anche il vantaggio che ReSharper non viene confuso.Con 'DirectCast (Nothing, Object)', pensa che sia ambiguo anche se il compilatore no. – hvd

+0

Incredibile come qualcosa di così semplice continua a diventare più strano e più strano. :-D – stakx