Wednesday, June 18, 2008

Bug en IntellSense

Hace como 4 días mientras trabajaba con LINQ le encontré un fallo al IntellSense de VS2008. Tras notificarlo en el sitio Microsoft Connect me dispongo a comentarlo en este post. Antes de empezar a ver como reproducir este error del IDE de C# debo decir que pude percatarme de el por haber leído en la mañana el capitulo sobre el tema en el libro de Jon Skeet sobre C#.

Por definición es posible tener un método extensor de tipo extensible T y un método estático en T que tengan la misma firma. Recordemos que un método extensor es puro azúcar sintáctico, el modificador this hace que se marque un método que cumpla las características con el atributo  System.Runtime.CompilerServices.ExtensionAttribute, a los efectos es un método como otro cualquiera.

Es en esta situación donde IntellSense se confunde. Vamos a reproducirlo:

 public class A
{
public static void Method(A obj){Console.WriteLine("instance");}
public static void Foo() { }
}

public static class AHelper
{
public static void Method(this A obj) { Console.WriteLine("extension");}
}

static class Program
{
static void Main()
{
A objA = new A();
objA.Method();
Console.Read();
}
}

En la segunda instruccion del metodo Main, si usted activa el motor de IntellSense luego de haber escrito el punctuator (".") vera como el metodo Method no tiene el icono esperado, tampoco el tooltip comienza con "(extension)":



 


Una vez terminado de escribir el nombre del método podemos ver como ya es reconocido por IntellSense como método extensor:



Si borramos el método estático de la clase el método extensor quedaría reivindicado:



Hasta otra bloggers :)

No comments: