表情体VS块体

Gre*_*reg 7 c# aspnet-compiler asp.net-core

在编码时,出现了差异.通常在编写简单方法或构造函数时,我经常使用表达体技术.但是,当我生成以下内容时:

public class Sample : ISample
{
     private readonly IConfigurationRoot configuration;

     public Sample(IConfigurationRoot configuration) => this.configuration = configuration;
}
Run Code Online (Sandbox Code Playgroud)

代码似乎是有效的,Visual Studio和编译都工作.问题虽然来自同一个类,我去使用configuration变量.它产生"字段初始值设定项不能引用非静态字段初始值设定项".

产生的语法用法:

var example = configuration.GetSection("Settings:Key").Value;
Run Code Online (Sandbox Code Playgroud)

但是,如果我将片段留在此上方并修改为块体.Visual Studio不再吓坏了,为什么表达体会导致如此特殊的错误?块体与上面的片段一起正常工作吗?

public class Sample : ISample
{
     private readonly IConfigurationRoot configuration;

     public Sample(IConfigurationRoot configuration)
     {
           this.configuration = configuration;
     }
}
Run Code Online (Sandbox Code Playgroud)
public class ApplicationProvider
{
     public IConfigurationRoot Configuration { get; } = CreateConfiguration();

     public IServiceProvider BuildProvider()
     {
         var services = new ServiceCollection();
         DependencyRegistration(services);

         return services.AddLogging().BuildServiceProvider();
     }

     private IConfigurationRoot CreateConfiguration() => new ConfigurationBuilder()
     .SetBasePath(AppContext.BaseDirectory)
     .AddJsonFile("appsettings.json")
     .Build();

     private void DependencyRegistration(this IServiceCollection services)
     {
          services.AddSingleton(_ => Configuration);
          // All other dependency registration would also go here.
     }
}

public static IServiceProvider ServiceProvider { get; } = new ApplicationProvider().BuildProvider();
Run Code Online (Sandbox Code Playgroud)

我会有一个类的接口,然后从提供程序中拉出来实例化.

ISample sample = ServiceProvider.GetServices<ISample>();
Run Code Online (Sandbox Code Playgroud)