gpt4 book ai didi

c# - 标签目标接收值意味着什么?

转载 作者:太空狗 更新时间:2023-10-29 21:27:28 24 4
gpt4 key购买 nike

我有几个关于 System.Linq.Expressions.LabelExpression 及其辅助类和方法的问题。

1) LabelExpression 类的文档如下:

表示一个标签,可以放在任何表达式上下文中。如果是跳转到,会得到对应的GotoExpression提供的值。否则,它接收 DefaultValue 中的值。如果 Type 等于 System.Void,则不应提供任何值。

向标签目标返回值是什么意思?换句话说,标签目标接收值意味着什么?我这辈子从来没有这样做过——当我跳转到标签目标时将值传递给它?

2) 虽然转到标签目标是完全合理的,但是返回继续和< em>突破标签目标?

  1. public static GotoExpression Return(LabelTarget target);
  2. public static GotoExpression Continue(LabelTarget target);
  3. public static GotoExpression Break(LabelTarget target)

最佳答案

有时,将 Linq 表达式视为一种在类似于 C# 但不完全是 C# 的内容中构建代码的方法会很有帮助。这是那些时代之一。

下面的代码是使用表达式的 Math.Max(int a, int b) 的实现。 return 语句没有像 C# 中那样的快捷方式。您必须创建标签。

        // (a, b => 
// {
// if(a > b)
// return a;
// else
// return b;
// }

var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var returnLabel = Expression.Label(typeof (int));
Expression<Func<int, int, int>> returnMax = (Expression<Func<int, int, int>>)Expression.Lambda
(
Expression.Block
(
Expression.IfThenElse
(
Expression.GreaterThan(a, b),
Expression.Return(returnLabel, a),
Expression.Return(returnLabel, b)
),
Expression.Label(returnLabel, Expression.Constant(0))
),
a,
b
);
var shouldBeSix = returnMax.Compile()(5, 6);

理解为什么 LabelExpression 需要一个值的关键:表达式总是有类型的(对于我们这里的目的,void 是一种类型),并且几乎总是返回一个值.例如,BlockExpression 采用最后一条语句的值。 AssignExpression 接受赋值。同样,LabelExpression 必须返回一个值。当与任何类型的 GotoExpression 一起使用时,永远不会使用该默认值,但以下代码是合法的:

        var returnLabel = Expression.Label(typeof (int));
Expression<Func<int>> returnsSix = (Expression<Func<int>>)Expression.Lambda
(
Expression.Label(
returnLabel,
Expression.Constant(6)
)
);

var alsoSix = returnsSix.Compile()();

...因此需要一个默认值。

因为 LabelExpression 必须有一个类型和一个值,所以默认值的类型、LabelTargetGotoExpression 都必须匹配。原始示例代码使用 0 作为默认值,但如您所见,它永远不会被使用。如果将 0 切换为 0.0null,表达式将在 .Compile() 调用时失败。

2) 从示例代码中可以看出,如果不使用标签目标,就无法从函数中“返回”。正如@Grax 暗示的那样,Expression.GotoExpression.ContinueExpression.BreakExpression.Return 全部返回GotoExpressions 功能几乎相同。

关于c# - 标签目标接收值意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27527155/

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