2012-08-02 78 views
1
if (statement) 
    base.Database.AddInParameter(command, "ColumnX", DbType.String, "StackOverflow"); 
else 
    base.Database.AddInParameter(command, "ColumnX", DbType.String, DBNull.Value); 

我想用if子句用法?

? "true" : "false" 

例如做这个声明在一个行:

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

,但事实却并非如此。视觉工作室说,意想不到的令牌为“:”

任何想法?谢谢

+2

为了将来的参考,这被称为三元运算符。 – zeencat 2012-08-02 19:40:15

+2

在一条线上拥有它的假设价值是什么? – Oded 2012-08-02 19:41:24

回答

5

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

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

可以使用它,如果你投无论是stringDBNull.Valueobject

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

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

6

为什么不这样做这样(我把它包裹了很多行为这样)?

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

更好。

+3

这不起作用。字符串和'DBNull.Value'不能相互转换。 – Oded 2012-08-02 19:37:41

+3

DBNull.Value不是字符串。首先将其转换为“object”可能会起作用。 – Brandon 2012-08-02 19:37:57

+0

是的,它不工作,视觉工作室说:没有隐式转换字符串和System.Dbnull – 2012-08-02 19:39:40

2

取出如果在开始,所以它读取。

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

如果你只是切换的字符串为DBNull的你应该替换变种,沿着线:

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

base.Database.AddInParameter(command, "ColumnX", DbType.String, theReplacement); 
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); 
+0

感谢DanM这是正确的..它真的很酷谢谢.. – 2012-08-02 19:43:03