if子句使用?

时间:2012-08-02 19:34:23

标签: c# if-statement

if (statement)
     base.Database.AddInParameter(command, "ColumnX", DbType.String, "StackOverflow");
 else
     base.Database.AddInParameter(command, "ColumnX", DbType.String, DBNull.Value);

我想使用

在一行中执行此语句
? "true" : "false" 

例如:

if(statement) ? base.Database.AddInParameter(command, "ColumnX", DbType.String, "StackOverflow") : base.Database.AddInParameter(command, "ColumnX", DbType.String, DBNull.Value);

但事实并非如此。 Visual Studio说出了“:”

的意外标记

任何想法?感谢

5 个答案:

答案 0 :(得分:6)

为什么不这样做(为了SO,我将它包裹在很多行上)?

 base.Database.AddInParameter(
    command, 
    "ColumnX", 
    DbType.String, 
    statement ? "StackOverflow" : (Object)DBNull.Value);

您的尝试无效C#。如果真的希望按照自己的方式进行,并在一行中使用if...else,则需要如下:

if(statement) base.Database.AddInParameter(command, "ColumnX", DbType.String, "StackOverflow"); else base.Database.AddInParameter(command, "ColumnX", DbType.String, DBNull.Value);

但这很难读。

即使很短:if (true) DoOne(); else DoTwo();并不那么容易。

if (true) 
    DoOne(); 
else 
    DoTwo();

更好。

答案 1 :(得分:5)

首先,conditional operator不需要if之前的(statement)

其次,你不能使用它作为条件的两边需要是一个类型或类型,其中一个可以隐式转换为另一个 - stringDBNull.Value不是这样的类型。

如果您将stringDBNull.Value投放到object

可以使用它
base.Database.AddInParameter(
                             command, 
                             "ColumnX", 
                             DbType.String, 
                             statement ? "StackOverflow" : (object)DBNull.Value);

但是,如果我必须在一行中阅读此内容,我会发现它比您发布的原始版本更少可读 - 将这个逻辑放在一行中是没有价值的,特别是如果它降低了可读性并使代码不易理解。

答案 2 :(得分:4)

ternary operator仅适用于作业。

你可以做的是:

var value = statement ? (object)"StackOverflow" : DBNull.Value;
base.Database.AddInParameter(command, "Column X", DbType.String, value);

当然,您也可以将它组合成一个语句(但如果你很好地格式化它实际上就是更多的行):

base.Database.AddInParameter(
    command,
    "Column X",
    DbType.String,
    statement ? (object)"StackOverflow" : DBNull.Value);

答案 3 :(得分:2)

在开头取出if,以便读取。

statement ? base.Database.AddInParameter(command, "ColumnX", DbType.String,"StackOverflow") : base.Database.AddInParameter(command,"ColumnX", DbType.String, DBNull.Value); 

答案 4 :(得分:2)

如果你只是为DBNull切换一个字符串,你应该只需要替换那个var:

var theReplacement = (statement ? (object)"StackOverflow" : DBNull.Value);

base.Database.AddInParameter(command, "ColumnX", DbType.String, theReplacement);