为何实例化LambdaCondition需显式指定泛型参数?如何实现自动推导?
问题解答
为什么编译器无法自动推导泛型参数?
C#的语言规则明确:泛型类的构造函数不支持自动推导泛型类型参数。即使你传入的第一个参数a是A类型,编译器也不会结合后续的lambda表达式共同推导TSource的类型,必须显式指定<A>才能完成类型匹配。
如何修改代码支持自动推导?
最常用且优雅的方案是给泛型类添加静态工厂方法——因为泛型方法支持自动类型推导。具体修改如下:
修改LambdaCondition类,添加静态工厂方法
public class LambdaCondition<TSource> : BaseLambdaCondition where TSource : class, INotifyPropertyChanged { // 保留原构造函数 public LambdaCondition(TSource source, Expression<Func<TSource, bool>> lambda, bool defaultValue) { // 原构造逻辑 } // 添加静态工厂方法,支持类型推导 public static LambdaCondition<TSource> Create(TSource source, Expression<Func<TSource, bool>> lambda, bool defaultValue) { return new LambdaCondition<TSource>(source, lambda, defaultValue); } }
使用方式(无需显式指定泛型参数)
A a = new A(); var condition = LambdaCondition.Create(a, vm => vm.Prop, false);
备选方案(C# 9.0+)
如果你使用的是C# 9.0及以上版本,可以利用目标类型推导省略new后的泛型参数,但变量类型仍需显式声明:
A a = new A(); LambdaCondition<A> condition = new(a, vm => vm.Prop, false);
不过这种方式依然需要指定A,体验不如静态工厂方法便捷。
内容的提问来源于stack exchange,提问作者Spook
相关产品推荐
相关产品推荐

