2011-08-30 12 views
7

Código en VB.NETde sintaxis y de cadena métodos de extensión VB.NET

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) En primer problema, yo preferiría ser capaz de utilizar "cucu" .MyExtensionMethod(), así como test.MyExtensionMethod();

1') sintaxis como

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

no funciona ambos

Sin embargo, la sintaxis como

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

funciona muy bien.

Parece que falta algo de consistencia en el comportamiento constante de la cadena.

2) Eche un vistazo a los COMENTARIOS (en la imagen adjunta). Las palabras "personalizado", "cadena" y "error" están resaltadas, sin embargo están en los comentarios, por lo tanto, deben ser verdes, no azules.

¿Por qué esto? ¿Qué solución?

EDIT:

Declarado como "fallo" en Microsoft Connect (incluso si no es más que una sintáctica "miss") ...

EDIT 2:

Como se comentó Hans Passant, norma los métodos de cadena, como "cucu".Trim(), tampoco funcionan.

+1

Um, la solución alternativa es asignarlo a una variable como lo hizo con 'test'? – BoltClock

+0

@BoltClock)))) bien, ¿por qué esto?)) – serhio

+1

¿Cómo estás tan seguro de que ya es un error? – BoltClock

Respuesta

2

Usted puede hacer CStr("cucu").ShowDialog()

8

puedo confirmar que esto es de hecho un “error” (probado en Visual Studio 2008). Pero, de hecho, es por diseño en VB y no cambiará.

Sin embargo, me gustaría tomar el tiempo para explicar por qué esta es una pregunta horrible. Lo siento, Serhio.

  1. No enumera todos los pasos necesarios para reproducir el problema.
  2. No proporciona el código completo.
  3. No reduce el problema al mínimo (no utilice Infer aquí - afea el problema)
  4. Como consecuencia, hay un centenar de diferentes razones por las que sería completamente explicar este comportamiento, sin un error (por ejemplo, vea stakx 'excelente (ahora borrada) respuesta).

Aquí hay un ejemplo completo, utilizando la configuración predeterminada para VB, que no tiene estos problemas (crear una nueva solución de proyecto de consola vacía y pega este código en 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 

El comportamiento es coherente en VB: no puede tener un valor como primer token en una línea lógica.Por ejemplo, el siguiente código también no compilar (dada una existente, apropiado, la definición de una clase de formulario Form1):

New Form1().ShowDialog() 

y una vez más la solución es para prefijar la expresión por Call:

Call New Form1().ShowDialog() 
+0

corrigió algunos de sus comentarios). .. Sé que esta no es tal vez una pregunta real. Solo me gustaría compartir este "problema". – serhio

Cuestiones relacionadas