Не удается захватить переменные в методах расширения - PullRequest
0 голосов
/ 23 апреля 2019

Мне нужен метод расширения, который возвращает лямбду для установки заданной переменной. Я просто ленив, но, по-моему, это немного очистит мой код.

Есть идеи, почему следующий код не работает? Я получаю сообщение, что float me не используется, поскольку оно задается лямбда-выражением, но я бы хотел, чтобы оно захватило float и вернуло лямбда-выражение для его установки.

public static Action<float> setter(this float me)
{
    return x => me = x;
}

1 Ответ

1 голос
/ 23 апреля 2019

Ваш код не работает, потому что он модифицирует локальную переменную в лямбда-выражении - тип значения float.

static void Main(string[] args)
{
    float f = 1;
    f.setter()(4);
    Console.WriteLine(f); // prints 1
}

Вам необходим метод расширения ref: https://github.com/dotnet/roslyn/issues/165 (C # 7.2):

public static Action<float> setter(ref this float me)
{
    return x => me = x;
}
...