2011-09-08 43 views
6

Duplicar posible:
C# 3.0 generic type inference - passing a delegate as a function parameter¿Por qué no se pueden inferir estos argumentos de tipo?

¿Por qué no se pueden deducir los argumentos de tipo del siguiente ejemplo de código en la llamada en Main?

using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Method(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
} 

Esto da el mensaje de error: CS0411

error: Los argumentos de tipo para el método Program.Method<T>(System.Action<T>) no pueden inferirse a partir del uso. Intente especificar los argumentos de tipo explícitamente.

+0

Muchas gracias. Busqué pero no pude encontrarlo. –

+0

@Pieter: la publicación mencionada por Darin tiene la respuesta, y tiene algunos buenos enlaces a más información. –

+0

Lee 10 publicaciones o algo así, pero la de arriba no estaba entre ellas. –

Respuesta

0

Acabo de poner esto es un compilador, veo lo que quieres decir.

Creo que es porque Action se utiliza como grupo de métodos, pero no es del tipo Action<int>.

Si lo lanzas a este tipo funciona:

Method((Action<int>)Action); 
+5

Esperaría que fuera int. Y supongo que el OP ya sabe lo que el compilador le dice. –

+0

Sí hasta que lo puse en un compilador, no saqué a la luz el contexto del problema. No es inmediatamente obvio que la Acción se refiere al método. – TheCodeKing

0

Esto funciona:

static void Main(string[] args) 
    { 
     Method<int>(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
+1

Sí, pero eso no es lo que se pregunta aquí. Lo que se pregunta es por qué lo que se muestra en el OP ** no funciona. –

2

El problema es que Action (aparte de ser ya un tipo, por favor, cambie su nombre) es en realidad un grupo de métodos que es convertible al tipo de delegado Action<int>. El motor de inferencia de tipos no puede inferir el tipo porque las expresiones del grupo de métodos son sin tipo. Si realmente transfiere el grupo de métodos a Action<int>, entonces la inferencia de tipos se realiza correctamente:

Method((Action<int>)Action); // Legal 
Cuestiones relacionadas