Используйте естественный лямбда-тип для неявного преобразования
Я пытаюсь создать тип 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());