【问题标题】:Use if statement in Action C#在 Action C# 中使用 if 语句
【发布时间】:2018-02-09 19:45:44
【问题描述】:

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

_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)));

当我尝试实现这一点时,我遇到了一个错误:

只有赋值、调用、递增、递减和新建对象 表达式可以用作语句

【问题讨论】:

  • 我什至没有看到 if 语句
  • “暂停,因为不清楚你在问什么”。认真的吗?
  • @EdPlunkett 似乎有大量错误关闭的问题。您会认为用户会在投票关闭 ¯\_(ツ)_/¯ 之前稍微阅读一下问题
  • @EdPlunkett 看看昨天的this one。我还在为它愤怒。 5 人投票重新开放,一个人回来并再次关闭它

标签: c#


【解决方案1】:

在 C# 中,这是一个表达式,而不是语句。作为一个完整的语句,它不会编译。在 Perl、JavaScript 和可能的其他语言中会很好,但语法是任意的,所以你不能可靠地从一种语言概括到另一种语言。

a ? b : c;

这不是“if 语句”;这是conditional expression。这是带有 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));
    }
});

看起来services.AddConfiguration() 需要Action<T>,而不是Func<T>,因此编译器将要求 lambda 的主体是语句,而不是表达式。

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

var d = a ? b : c;

这就是条件运算符的用途,但这不是您想要做的。

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 2013-07-12
    • 2011-07-24
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多