2010-02-12 17 views
6

tengo una clase con un método sobrecargado:llamada ambigua con una lambda en C# .NET

MyClass.DoThis(Action<Foo> action); 
MyClass.DoThis(Action<Bar> action); 

Quiero pasar una expresión lambda a la versión Acción:

MyClass.DoThis(foo => foo.DoSomething()); 

Desafortunadamente, Visual Studio correctamente no puede distinguir entre las versiones Action<Foo> y Action<Bar>, debido a la inferencia de tipo que rodea a la variable "foo", por lo que genera un error de compilación:

The call is ambiguous between the following methods or properties: 'MyClass.DoThis(System.Action <Foo>)' and 'MyClass.DoThis(System.Action <Bar>)'

¿Cuál es la mejor manera de evitar esto?

Respuesta

23
MyClass.DoThis((Foo foo) => foo.DoSomething()); 
2

No hay forma de que el compilador lo descubra por sí mismo. La llamada es de hecho ambigua y tendrá que aclarar de alguna manera la sobrecarga que desea para el compilador. El nombre del parámetro "foo" es insignificante aquí en la resolución de sobrecarga.

MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething())); 
0

La forma que conozco es el uso de un delegado de estilo antiguo:

MyClass.DoThis(delegate(Foo foo) { 
    foo.DoSomething(); 
}); 

Esto es mucho más detallado que una lambda. También me preocupa que no funcione si quieres una expresión arbórea, aunque no estoy seguro de esto.

Cuestiones relacionadas