在Action C#中使用if语句

dev*_*per 1 c#

我有一个bool变量_settings.Value.UsePostgreSQL和方法 AddConfiguration(this IServiceCollection builder, Action<DbContextOptionsBuilder> dbContextOptionsAction = null) 是否可以if在方法中使用条件Action作为参数?像这样的东西:

_settings.Value.UsePostgreSQL = true;
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
services.AddConfiguration(builder =>
    _settings.Value.UsePostgreSQL ?
        builder.UseSqlServer(_settings.Value.ConnectionString, options =>
            options.MigrationsAssembly(migrationsAssembly)) :
        builder.UseNpgsql(_settings.Value.ConnectionString, options =>
            options.MigrationsAssembly(migrationsAssembly)));
Run Code Online (Sandbox Code Playgroud)

虽然我正在尝试实现这一点,但我有一个错误:

只有赋值,调用,递增,递减和新对象表达式才能用作语句

15e*_*153 9

在C#中,这是一个表达式,而不是一个语句.作为一个完整的声明,它将无法编译.它可以在Perl,JavaScript和其他语言中使用,但语法是任意的,所以你不能可靠地从一种语言推广到另一种语言.

a ? b : c;
Run Code Online (Sandbox Code Playgroud)

它不是"if声明"; 这是一个条件表达式.这是带有if语句的代码; 我希望这个版本能为你编译,但请告诉我.

services.AddConfiguration(builder =>
{
    if (_settings.Value.UsePostgreSQL) {
        builder.UseSqlServer(_settings.Value.ConnectionString, 
            options => options.MigrationsAssembly(migrationsAssembly));
    } else {
        builder.UseNpgsql(_settings.Value.ConnectionString, 
            options => options.MigrationsAssembly(migrationsAssembly));
    }
});
Run Code Online (Sandbox Code Playgroud)

它看起来像是services.AddConfiguration()期望a Action<T>而不是a Func<T>,因此编译器将要求lambda的主体是一个语句,而不是一个表达式.

这是一个包含条件表达式的语句,它将编译:

var d = a ? b : c;
Run Code Online (Sandbox Code Playgroud)

这就是条件运算符的用途,但它不是你想要做的.