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#.
@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
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
Incredibile come qualcosa di così semplice continua a diventare più strano e più strano. :-D – stakx