2011-08-30 18 views
7

codice in VB.NETVB.NET sintassi e stringhe Metodi di estensione

Module Utils 
<Runtime.CompilerServices.Extension()> _ 
Public Sub Print(ByVal message As String) 
    Console.WriteLine(message) 
End Sub 
End Module 

Public Class Foo 
Public Sub New() 
    Dim test = "cucu" 
    test.Print() ' no problem: custom string extension method ' 
    "cucu".Print() ' syntax error ' 
End Sub 
End Class 

1) Primo problema, preferirei essere in grado di usare "Cucu" .MyExtensionMethod(), così come test.MyExtensionMethod();

1') Sintassi come

"No Result".Print() ' Print is an extension method ' 
    " No Result ".Trim() ' Trim is a framework method ' 

non funziona entrambi

Tuttavia, sintassi come

myTextBox.Text = "No Result".Translate() ' Translate is an extension method ' 
    myTextBox.Text = " No Result ".Trim() ' Trim is a framework method ' 

funziona molto bene.

Quindi sembra una mancanza di coerenza del comportamento costante della stringa.

2) Dai un'occhiata ai COMMENTI (nella foto allegata). Le parole "personalizzato", "stringa" e "errore" sono evidenziate, tuttavia sono nei commenti, quindi dovrebbero essere verdi, non blu.

Perché questo? Quale soluzione alternativa?

EDIT:

dichiarata come "bug" in Microsoft Connect (anche se non è più che una "miss" sintattico) ...

EDIT 2:

Come ha osservato Hans Passant, di serie metodi di stringa, come "cucu".Trim() non funziona neanche.

+1

Um, la soluzione è assegnarla a una variabile come hai fatto con 'test'? – BoltClock

+0

@BoltClock))))) ok, perché questo?)) – serhio

+1

Come sei sicuro che sia già un bug? – BoltClock

risposta

2

Si può fare CStr("cucu").ShowDialog()

8

posso confermare questo è davvero un “bug” (testato in Visual Studio 2008). Ma in realtà, è di progettazione in VB e non verrà modificato.

Tuttavia, mi piacerebbe prendere il tempo di spiegare perché questa è una domanda orribile. Mi dispiace Serhio.

  1. Non elenca tutti i passaggi necessari per riprodurre il problema.
  2. Non fornisce il codice completo.
  3. Non riduce il problema al minimo (non usare Infer qui - si toglie il problema)
  4. Di conseguenza, ci sono un centinaio di ragioni diverse che sarebbe completamente spiegare questo comportamento, senza un bug (per esempio, vedere stakx 'eccellente (ora cancellata) risposta).

Ecco un esempio completo, utilizzando le impostazioni predefinite per VB, che non ha di questi problemi (creare una nuova soluzione progetto di console vuota e incollare questo codice in Module1.vb):

Module Extensions 
    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub ShowDialog(ByVal message As String) 
     Console.WriteLine(message) 
    End Sub 
End Module 

Module Module1 
    Sub Main() 
     Dim s As String = "Hello" 
     s.ShowDialog() 
     ' Doesn’t work: 
     '"World".ShowDialog() 
     ' Works: 
     Call "World".ShowDialog() 
    End Sub 
End Module 

Il comportamento è coerente in VB: non puoi avere un valore come primo token in una linea logica.Ad esempio, il seguente codice anche non compila (dato un esistente, appropriato, definizione di una classe forma Form1):

New Form1().ShowDialog() 

e ancora una volta la correzione è anteporre all'espressione Call:

Call New Form1().ShowDialog() 
+0

corretto alcune delle tue osservazioni). .. So che questa non è forse una vera domanda. Vorrei solo condividere questo "problema". – serhio

Problemi correlati