Объяснение типа вывода

91
9

У меня есть следующий фрагмент кода:


namespace ConsoleApplication1
{
using System.Collections.Generic;
using System.Linq;

internal class Program
{
private static void Main(string[] args)
{
var bar = new object();

var result = new int[] { 1, 2, 3 }
.Select/* <int,int> */(bar.Test<int>)
.ToList();
}
}

public static class Extensions
{
public static TReturnType Test<TReturnType>(this object o, int e)
{
return default(TReturnType);
}
}
}


Компиляция этого на машине только с Visual Studio 2012 работает как прелесть. Однако, чтобы скомпилировать его на машине всего за 2010 год, требуется удалить комментарий вокруг <int, int>.


Может кто-нибудь уточнить, почему это работает в 2012 году, и где в спецификации это объясняется?

спросил(а) 2013-10-03T14:32:00+04:00 7 лет назад
1
Решение
71

Проблема возникает из вывода типа метода расширения в VS2010.


Если вы замените метод расширения статическим методом, введите вывод в порядке:


namespace ConsoleApplication1
{
using System.Collections.Generic;
using System.Linq;

internal class Program
{
private static void Main(string[] args)
{
var result = new int[] { 1, 2, 3 }
.Select/* <int,int> */(Extensions.Test<int>)
.ToList();
}
}

public static class Extensions
{
public static TReturnType Test<TReturnType>(int e)
{
return default(TReturnType);
}
}
}

Нет четкого ответа Microsoft на этот вопрос в С# Language Specification version 5.0 (см. раздел 7.5.2).


Для получения дополнительной информации вы можете прочитать ответы по этому аналогичному вопросу: why-doesnt-this-code-compile-in-vs2010-with-net-4-0

ответил(а) 2013-10-03T16:12:00+04:00 7 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема