关于隐式强制转换,我对C#如何处理lambda表达式感到有点困惑.
我的目标类似于下面这个最小的例子:
A<int>.DoSomething(x => x == 42);
public static class A<T>
{
public static void DoSomething(PredicateAdapter<T> _) { }
}
public class PredicateAdapter<T>
{
public static implicit operator PredicateAdapter<T>(Predicate<T> _) => new();
}
所以我想为谓词创建一个包装器,它允许我做一些奇特的事情(为简洁起见,在本例中没有列出).然而,上面的代码不能编译,因为"错误CS1660:无法将lambda表达式转换为‘PredicateAdapter’类型,因为它不是委托类型".
相比之下,以下是隐式强制转换的工作原理的示例:
A<int>.DoSomething(x => x == 42);
public static class A<T>
{
public static void DoSomething(Predicate<T> _) { }
}
编译器能够推断Lambda表达式x => x == 42
可以被隐式地强制转换为Predicate<int>
,并且将其愉快地传递给A<int>.DoSomething(Predicate<int>)
.
此外,将lambda显式强制转换为Predicate<int>
意味着将应用我的自定义隐式强制转换并工作:
A<int>.DoSomething((Predicate<int>)(x => x == 42));
public static class A<T>
{
public static void DoSomething(PredicateAdapter<T> _) { }
}
public class PredicateAdapter<T>
{
public static implicit operator PredicateAdapter<T>(Predicate<T> _) => new();
}
所以我的问题是为什么我需要显式地转换lambda(并且编写可读性更差的代码),而C#显然能够隐式地进行这种转换?并且:有没有可能修改类A
和PredicateAdapter
,使我可以使用一个简单的lambda表达式(没有任何显式的转换),仍然使用PredicateAdapter
?