我有一个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)
虽然我正在尝试实现这一点,但我有一个错误:
只有赋值,调用,递增,递减和新对象表达式才能用作语句
在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)
这就是条件运算符的用途,但它不是你想要做的.