2012-08-02 30 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