なぜこれが機能しないのか疑問に思います。洞察に感謝します。
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();
}
MyTest()からの期待される出力は、リスト{2、3}です。ただし、コンパイラはinput.Contains(b)
、に次の2つのエラーを報告します。
引数1:「int」から「T」に変換できません
'System.Collections.Generic.List.Contains(T)'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります
このWhere()句は、汎用リストを使用しない場合は正常に機能します。
これは私の現実の問題を単純化したものなので、「なぜこれを書いているのか」にとらわれないでください。問題は、エラーとそれが発生する理由です。
(うまくいけば)明確にするために改訂:
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;
}
}
}
同じコンパイラエラーがで報告されinput.Contains(f.Property)
ます。