gpt4 book ai didi

c# - 表达式树 - C# 和 VB.NET 中 Action 的不同编译器行为

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:15 25 4
gpt4 key购买 nike

给定一段可以返回 VB.NET 中属性名称的简单代码:

Function NameForProperty(Of T)(ByVal field As Expression(Of Action(Of T))) As String

Dim expression = DirectCast(field.Body, MemberExpression)

Return expression.Member.Name

End Function

它的工作原理是这样的:

NameForProperty(Of String)(Function (s) s.Length) ' ==> returns "Length"

我认为在 C# 中是等价的:

string NameForProperty<T>(Expression<Action<T>> field)
{
var expression = (MemberExpression)field.Body;

return expression.Member.Name;
}

当我尝试调用 C# 版本时:

NameForProperty<string>(s=>s.Length);

它返回一个编译器错误:

Only assignment, call, increment, decrement, and new object expressions can be used as a statement

我的问题是:这两段代码有什么区别?

编辑

Ivan 提供了一个 answer至于为什么代码在 C# 中不起作用。我仍然很好奇为什么它在 VB.NET 中有效。

编辑#2

明确地说,我不是在寻找可以工作的代码——只是为什么代码可以在 VB.NET 而不是 C# 中工作。

最佳答案

public static class TypeMember<TClass>
{
public static string PropertyName<TProp>(Expression<Func<TClass, TProp>> expression)
{
var body = expression.Body as MemberExpression;

if (body == null)
throw new ArgumentException("'expression' should be a property expression");

return body.Member.Name;
}
}

var propName = TypeMember<string>.PropertyName(s => s.Length);

您的版本的问题在于您正在尝试使用 Action<T> .它不返回任何内容,因此 lambda 的正文 ( s.Length) 应该是一个语句。这实际上不是一个声明。所以编译器会提示它。

如果你写了它也会以同样的方式提示

public void A()
{
string s = "abc";
s.Length;
}

这是一回事。

虽然我不是 VB.NET 专家,所以我无法解释为什么它在 VB 中工作,抱歉。

关于c# - 表达式树 - C# 和 VB.NET 中 Action<T> 的不同编译器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6811868/

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