2013-10-08 44 views
2
public List<Tuple<int, int, int, string, int, int, Tuple<bool, bool, int?>>> 
    GetValues(int someId, int someOtherlId) 
{ 
    var t = new List<Tuple<int, int, int, string, int, int, Tuple<bool, bool, int?>>>(); 
    using (var context = new Entities(ConnString)) 
    { 
     var pc = context.SomeTable.Where(c => c.SomeId == someId && 
      c.SomeOtherId == someOtherId).OrderBy(c => c.Id).ToList(); 
     t.AddRange(pc.Select(cols => new Tuple<int, int, int, string, int, int, Tuple<bool, bool, int?>> 
      (cols.Id, cols.someId, cols.someOtherId, cols.ColumnName, cols.MinDataLength, 
      cols.MaxDataLength, new Tuple<bool, bool, int?>(cols.Required, cols.Eav.HasValue && cols.Eav.Value, 
       cols.AttribId.HasValue ? cols.AttribId.Value : null)))); 
    } 
     return t; 
    } 
} 

無法弄清楚爲什麼這段代碼不會編譯並生成「沒有隱式'int'和'null'之間的轉換錯誤。試圖將null分配給可爲空的int結果「int'和'null'之間沒有隱式轉換」錯誤

在那第二個tuple int?被一致標記爲可爲空,所以爲什麼它被編譯器在t.AddRange中檢測爲正常int,它生成「無法確定條件表達式的類型,因爲在cols.AttribId.HasValue ? cols.AttribId.Value : null處不存在'int'和''」錯誤之間的隱式轉換。

任何想法?

+0

Duplicate:http://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden?rq = 1 –

+2

'Tuple'只是醜陋的!至少將這個類擴展到一個自定義類中! –

+0

@ m-y也許,但它肯定會擊敗DTO,將數據從DAL轉移到BI層......至少在我的書中。 –

回答

3

如果你想一個int?添加到已接受int?一個元組爲什麼不乾脆直接將它添加到你的元組—如更換:

new Tuple<bool, bool, int?>(..., cols.AttribId.HasValue ? cols.AttribId.Value : null) 

隨着

new Tuple<bool, bool, int?>(..., cols.AttribId) 

還是要一點點清潔劑,利用型號推理Tuple.Create

Tuple.Create(..., cols.AttribId) 
+0

是的,這顯然更好,我從非空值轉換爲空值,以便不再需要檢查,正如您指出的那樣... –

3

試試這個:

cols.AttribId.HasValue ? (int?)cols.AttribId.Value : null 

發生了什麼事是,C#三元,必須有同時存在值之間的隱式轉換。當你寫:

cols.AttribId.HasValue ? cols.AttribId.Value : null 

cols.AttribId.Valueint不能轉換爲null。然而int?可以將轉換爲null

+0

這工作,關心解釋爲什麼?我的意思是,AttribId是數據庫中的可空字段...我假設AttribId.Value不能爲空,因此是一個int ... –

+0

編輯回答與解釋 –

+1

請注意,它也可以用其他方式工作:'' cols.AttribId.HasValue? cols.AttribId.Value:(int?)null'。 –

相關問題