Je me demande pourquoi ça ne marche pas. Merci de votre compréhension.
static void Main(string[] args)
{
List<int> foo = new List<int> { 1, 2, 3 };
var myResult = MyTest<int>(foo);
}
private static List<int> MyTest<T>(List<T> input)
{
List<int> bar = new List<int> { 2, 3, 4 };
return bar.Where(b => input.Contains(b)).ToList();
}
La sortie attendue de MyTest() est une liste { 2, 3 }. Cependant, le compilateur signale deux erreurs sur input.Contains(b)
comme suit :
-
Argument 1 : ne peut pas convertir de 'int' en 'T'.
-
La meilleure méthode surchargée correspondant à 'System.Collections.Generic.List.Contains(T)' possède des arguments non valides.
Cette clause Where() fonctionne bien si je n'utilise pas de listes génériques.
Il s'agit d'une simplification de mon problème réel, alors s'il vous plaît ne restez pas bloqué sur "pourquoi écrivez-vous ceci ?". Le problème est l'erreur et pourquoi elle se produit.
Révisé pour (espérons-le) plus de clarté :
namespace SandBox
{
class Foo
{
public int FooInt { get; set; }
public string FooString { get; set; }
}
class Program
{
private static List<Foo> fooList = new List<Foo> {
new Foo() {FooInt = 1, FooString = "A"},
new Foo() {FooInt = 2, FooString = "B"},
new Foo() {FooInt = 3, FooString = "C"}
};
static void Main(string[] args)
{
List<int> myIntList = new List<int> { 1, 2 };
var myFirstResult = GetFoos<int>(myIntList);
List<string> myStringList = new List<string> { "A", "B" };
var mySecondResult = GetFoos<string>(myStringList);
}
/// <summary>
/// Return a list of Foo objects that match the input parameter list
/// </summary>
private static List<Foo> GetFoos<T>(List<T> input)
{
//***
// Imagine lots of code here that I don't want to duplicate in
// an overload of GetFoos()
//***
if (input is List<int>)
{
//Use this statement if a list of integer values was passed in
return fooList.Where(f => input.Contains(f.FooInt));
}
else if (input is List<string>)
{
//Use this statement if a list of string values was passed in
return fooList.Where(f => input.Contains(f.FooString));
}
else
return null;
}
}
}
Les mêmes erreurs de compilation sont signalées sur input.Contains(f.Property)
.