formularios - propiedad tag c#
Confundido en cuanto a por qué este código C#se compila, mientras que un código similar no lo hace (1)
Inferencia de tipos convierte tu primera llamada a
In<object>(x, p);
Los parámetros de este método genérico cerrado son object, params object[]
.
Por lo tanto, pasar p
implícitamente lo convierte en un object
, que se convierte en el único elemento en la matriz params.
Su segunda llamada se infiere (debido al primer parámetro) para
In<int>(x, p);
Aquí, el segundo parámetro puede ser un int[]
(pasando directamente una matriz) o una serie de int
s (a través de params
).
Ya que IEnumerable<int>
no es ninguno de esos, obtienes un error.
Tomemos el siguiente método de extensión:
static class Extensions
{
public static bool In<T>(this T t, params T[] values)
{
return false;
}
}
Tengo curiosidad por saber por qué este código se compila y ejecuta:
var x = new Object();
IEnumerable<int> p = new List<int> { 1, 2, 3 };
var t2 = x.In(p);
Dentro de, los values
son un Object[]
, como si la List<int>
se convierte al vuelo en una matriz. Para mí, parece que los params T[]
no coinciden con IEnumerable<int>
, por lo que me sorprende que esto incluso se ejecute.
Ahora este código:
var x = 5;
IEnumerable<int> p = new List<int> { 1, 2, 3 };
var t2 = x.In(p);
No se ejecuta y genera el error del compilador:
Error 2 Argumento 2: no se puede convertir de ''System.Collections.Generic.IEnumerable'' a ''int []''
Esto es lo que esperaría de la primera en realidad. ¿Alguien puede explicar lo que está pasando aquí? ¡Gracias!