【问题标题】:Why does "=>" assignment work in this case but not "="?为什么“=>”分配在这种情况下有效,而不是“=”?
【发布时间】:2017-06-11 07:39:13
【问题描述】:

我在工作中继承了一个 C# MVC Web 应用程序,并且在控制器类中直接有一个分配,如下所示:

public class FooController : Controller
{
    private IAuthenticationManager AuthenticationManager => HttpContext.GetOwinContext().Authentication;
}

Visual Studio 用错误突出显示它,例如“;预期”。但它编译并运行得很好。如果我将“=>”更改为简单的赋值“=”,它会突出显示 HttpContext,并显示错误“非静态字段 bla bla bla...需要对象引用”,并且不会编译。

所以这是我的问题。为什么使用“=>”运算符编译并正常工作?我是 C# 的新手(来自 Android/iOS 开发),所以虽然理解一些东西很容易,但像这样的东西让我感到困惑。

【问题讨论】:

标签: c# .net assignment-operator


【解决方案1】:

=> 不是分配。它是 C# 6 中添加的一种快捷方式、语法糖,被称为“表达式体函数成员”。

与以下内容相同:

private IAuthenticationManager AuthenticationManager
{
    get { return HttpContext.GetOwinContext().Authentication; }
}

编辑:添加来自 BradleyDotNET 的评论以澄清答案:

更具体地说;它通过赋值起作用,因为它在属性 getter 中返回方法调用,而不是在初始化时尝试将方法返回值分配给类成员(这是不允许的)

有关详细信息,请参阅this MSDN article

【讨论】:

  • 我喜欢 C# 6 中的这个新增功能,我一直都在使用它。与使用 pre-6 语法的一组属性相比,拥有一组单行只读属性看起来很棒。我也期待 C# 7 的变化,他们通过添加一个选项来扩展行为,以对 setter 执行类似的操作。
  • 考虑到它与 lambda 表达式的使用有多么相似,它并没有那么多糖。它非常一致。
  • @BradleyDotNET 这让我更清楚了。谢谢。
  • 阅读您的链接后的小挑剔:当用于声明仅 getter 属性时,它被称为“表达式主体属性”,当用于声明函数时,它是“表达式主体函数”。 string Method() => "test"; 当然不会扩展到string Method() { get { return "test"; } }
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 2017-05-17
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2013-04-23
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多