You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:07:56