gpt4 book ai didi

.net-core - .NET Core 和类型相等

转载 作者:行者123 更新时间:2023-12-03 16:49:42 25 4
gpt4 key购买 nike

本次测试:

[Fact]
public void X()
{
Assert.IsType<Expression<Func<int>>>(Expression.Lambda<Func<int>>(Expression.Constant(1)));
}

在 .NET Framework 上运行,但在 .NET Core(在我的情况下为 3.1)上失败并出现以下错误:
Expected: System.Linq.Expressions.Expression`1[[System.Func`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]
Actual: System.Linq.Expressions.Expression0`1[[System.Func`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]

为什么是这样?我可以做些什么来正确比较类型吗?

最佳答案

不正确 我之前回答的版本:

Assuming the behavior for .Net Core is the same or similar to framework, here is my reasoning.

Looking at the reference source code Expression.Lambda<T> creates a runtime type of Expression<T>, see typeof(Expression<>).MakeGenericType.

typeof(Expression<T>) however is the compile time type.



使用以下 LINQPad 脚本,您会看到输出中的差异

var exp = Expression.Lambda<Func<Int32>>(Expression.Constant(1));
exp.GetType().BaseType.Dump();
// System.Linq.Expressions.Expression`1[System.Func`1[System.Int32]]
typeof(Expression<Func<Int32>>).BaseType.Dump();
// System.Linq.Expressions.LambdaExpression

对于 .Net Framework Expression<T> 的实例从 Expression.Lambda<T>(Expression exp) 返回正如预期的那样。

但是对于 .Net Core 的行为被改变了!

对于 .Net Core Expression<TDelegate>.CreateExpressionCreator<TDelegate>.CreateExpressionFunc沿途被调用,但在这两种情况下 - 对于这里的这个例子 - Expression0{T} : Expression{T} 的新实例回来了!这显然不是同一类型。

断言您可以使用的类型

var expression = Expression.Lambda<Func<int>>(Expression.Constant(1));
// extract the type of used generics
var genericArgs = expression.GetType().GetGenericArguments();
// TODO: assert that we DO have exactly one argument here
Assert.IsType<Func<int>>(genericArgs[0]);

// another assert:
// unverified, but `(expression is Expression<Func<int>> _).Dump();` returns `true` in LINQPad
Assert.True(expression is Expression<Func<int>>);

关于.net-core - .NET Core 和类型相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60452684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com