Используйте естественный лямбда-тип для неявного преобразования

Я пытаюсь создать тип C #, который может быть неявно приведен из Vа также . Для второго варианта, следовательно, получает оператор неявного преобразования, который принимает Func<K,V>в качестве аргумента. Я использую C # 10 с .Net 6.

Теперь у меня есть метод, ожидающий. Однако, похоже, я не могу вызвать этот метод, передав лямбда-выражение; в сообщении об ошибке говорится, что преобразование из лямбда-выражения невозможно, поскольку оно не является типом делегата.

Есть ли способ заставить это работать? Я понимаю, что для этого потребуются два шага неявного преобразования (от лямбды к естественному типу делегата, а затем к Generator<K,V>), но я надеялся, что это действительно возможно. Также, конечно, я мог бы создать две перегрузки для Test метод ниже, но фактический код имеет 4-5 аргументов, каждый из которых может быть константой или лямбда-выражением, поэтому я бы получил много перегрузок.

Код:

      public abstract class Generator<K, V>
{
    public abstract V Generate(K key);

    public static implicit operator Generator<K, V>(V value) => new FixedGenerator(value);
    public static implicit operator Generator<K, V>(Func<K, V> func) => new LambdaGenerator(func);

    private class FixedGenerator : Generator<K, V>
    {
        private readonly V _result;

        public FixedGenerator(V result)
        {
            _result = result;
        }

        public override V Generate(K _) => _result;
    }

    private class LambdaGenerator : Generator<K, V>
    {
        private readonly Func<K, V> _func;

        public LambdaGenerator(Func<K, V> func)
        {
            _func = func;
        }

        public override V Generate(K key) => _func(key);
    }
}

void Test(Generator<K,V> generator) {
    // Do something
}

// This works
Test(5);

// This also works
Test((Func<int,string>)((int i) => i.ToString()));

// This line fails with code CS1660
Test((int i) => i.ToString());

0 ответов

Другие вопросы по тегам