Я столкнулся со странным поведением в Visual Studio 2010 при использовании анонимных методов в функциях, которые перегружены различными делегатами Func.
Ниже я создал небольшой класс воспроизведения.
Рассмотрим этот класс ListViewAdapter
namespace LambdaTestApp
{
public class ListViewAdapter<T>
{
private Func<int, string, int, string> _converter1;
private Func<RefType1, string, string> _converter2;
public ListViewAdapter(int arg1, Func<int, string, int, string> converter)
{
_converter1 = converter;
}
public ListViewAdapter(int arg1, Func<RefType1, string, string> converter)
{
_converter2 = converter;
}
public static ListViewAdapter<T> MockPopulate(int arg, Func<int, string, int, string> converter) {
ListViewAdapter<T> instance = new ListViewAdapter<T>(arg, converter);
return instance;
}
public static ListViewAdapter<T> MockPopulate(int arg, Func<RefType1, string, string> converter)
{
ListViewAdapter<T> instance = new ListViewAdapter<T>(arg, converter);
return instance;
}
}
public class RefType1
{
public string Property1 { get; set; }
}
}
И этот следующий код, который использует перегрузку с лямбда-выражением:
namespace LambdaTestApp
{
class Program
{
static void Main(string[] args)
{
ListViewAdapter<RefType1>.MockPopulate(1, (item, str) =>
{
var myItem = item;
return str;
});
}
}
}
Это должно разрешиться до Func<RefType1, string, string>
первый аргумент должен быть RefType1
, однако проблема в том, что вместо item
, являющегося RefType1
, Visual Studio видит его как int
.
Вопрос: существует ли допустимое преобразование между делегатами Func?это не очевидно, или это ошибка Visual Studio IntelliSense?