Почему я не могу передать только имя метода, где ожидается похожий тип Func? - PullRequest
4 голосов
/ 08 июля 2010

Почему эта проверка типа C # не выполняется? В этом примере я пытаюсь передать метод типа string -> string как Func<string, string>. Казалось бы, вполне разумно было бы опускать лямбда-синтаксис при передаче только имени функции с соответствующим типом.

using System;
using System.Linq;

class WeakInference
{
  public static void Main (string [] args)
  {
    // doesn't typecheck
    var hellos = args.Select (AppendHello); 

    // have to do this:
    // var hellos = args.Select (s => AppendHello (s));
  }

  static string AppendHello (string s)
  {
    return s + "hello";
  }
}

1 Ответ

6 голосов
/ 08 июля 2010

Вы можете использовать компилятор C # 4. Компилятор C # 3 имел более слабый вывод типов при преобразованиях групп методов. Подробности можно прочитать в ответе Эрика Липперта здесь . Мне не совсем ясно, означает ли это, что компилятор C # 3 на самом деле не реализует спецификацию C # 3, или сама спецификация изменилась между 3 и 4 в этой области. Это довольно академический вопрос по сравнению с тем, делает ли компилятор то, что вы хотите ;;

(Я только что проверил это, и ваша программа не компилируется с VS 2008, но компилируется с VS 2010.)

...