.NET Core与.NET Framework类型相等测试差异原因及解决方法
问题分析与解决
为什么会出现这个差异?
这个问题我之前也碰到过,核心原因其实是两方面的结合:
- .NET Framework与.NET Core的表达式树实现差异:
在.NET Framework里,Expression.Lambda<TDelegate>返回的实例,其精确运行时类型就是泛型基类Expression<TDelegate>(也就是你看到的Expression1)。但到了.NET Core 3.1版本,表达式树模块做了性能优化,会根据表达式的具体场景返回**派生自Expression的内部私有实现类**——你报错里的Expression01就是这类内部类的自动生成命名,属于框架底层的细节变化。 Assert.IsType<T>的严格检查逻辑:
这个断言方法的作用是验证实例的精确运行时类型是否完全等于T,而不是验证该实例是否可以被赋值给T(也就是是否是T或其派生类)。所以当.NET Core返回的是派生类实例时,这个严格匹配的断言自然就失败了。
正确的类型比较方式
根据你的测试意图,推荐两种可行方案:
方案1:验证类型兼容性(推荐)
如果你只是想确认返回的实例确实是Expression<Func<int>>类型(或其兼容类型),应该使用Assert.IsAssignableFrom<T>方法,它会检查实例是否可以被安全赋值给目标类型(支持基类/接口与派生类的兼容判断)。修改后的代码如下:
[Fact] public void X() { var lambdaExpr = Expression.Lambda<Func<int>>(Expression.Constant(1)); Assert.IsAssignableFrom<Expression<Func<int>>>(lambdaExpr); }
方案2:精确匹配类型(不推荐)
如果你确实需要严格匹配精确类型(这种场景非常少见,通常只有对框架内部实现有强依赖时才需要),可以通过反射获取那个内部类型,但强烈不建议这么做——因为内部类型属于框架私有API,会随.NET版本更新而变化,你的测试会变得极易断裂。
内容的提问来源于stack exchange,提问作者asgerhallas
相关产品推荐
相关产品推荐

