4

У меня есть следующий фрагмент кода:Общий вывод типа объяснение

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); 
     } 
    } 
} 

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

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

+1

Они, вероятно, улучшили возможность вывода типов компилятора, но это не кажется, в списке изменений: HTTP://stackoverflow.com/a/11549260/870604 – ken2k

ответ

2

Проблема возникает из-за вывода типа расширения в 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 об этом вопросе в C# Language Specification версии 5.0 (смотри раздел 7.5.2).

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

Смежные вопросы