2016-07-14 79 views
0
var account = new TRANSPORT_TO_ACCOUNT 
{ 
    TransportLayerId = reader["ID"] as string, 
    ... 
    BLOCKED = reader["BLOCKED"] as bool, 
}; 
accounts.Add(account); 

我對此代碼有問題。正確的布爾定義爲不可爲空的運算符

的作爲操作者必須與參考類型或空類型被使用(「布爾」是一個非空值類型)

我應該如何正確聲明BLOCKED在這種情況下?

+0

什麼是'reader'?如果它是'DbDataReader'的一些衍生物,那麼它可以使用'GetBoolean()'和'IsDbNull()'方法。 –

回答

5

如果確定該屬性是bool,然後只投它:

var account = new TRANSPORT_TO_ACCOUNT 
       { TransportLayerId = (string)reader["ID"] 
       , BLOCKED = (bool)reader["BLOCKED"] 
       }; 

accounts.Add(account); 

或者,如果你不知道是有值與否:

, BLOCKED = (bool?)reader["BLOCKED"] 

或者如果你是甚至不知道它是一個(可爲空)布爾字段:

, BLOCKED = reader["BLOCKED"] as bool? 

而且如果reader是一個DbDataReader ,您可以使用GetBoolean,因爲建議使用Rene Vogt

作爲一個方面說明:你應該遵守你的命名約定。屬性和類應該是駱駝案件,所以它將是BlockedTransportToAccount

+0

謝謝,看起來正確。 – AlexanderK

+1

請注意,如果值爲null,則第一個版本('(bool)reader。[...]')將引發異常。 –

+1

同意,但它不是'bool',我將其作爲要求陳述,也可以從該問題中讀取。 –

2

如果您readerDbDataReader某些衍生物(例如SqlDataReader),你可以使用IsDbNull()GetBoolean()

int blockedIndex = reader.GetOrdinal("BLOCKED"); 
var account = new TRANSPORT_TO_ACCOUNT 
{ 
    TransportLayerId = reader["ID"] as string, 
    ... 
    BLOCKED = reader.IsDbNull(blockedIndex) 
       ? (bool?)null 
       : reader.GetBoolean(blockedIndex) 
}; 
accounts.Add(account); 

由於IsDbNullGetBoolean使用列索引作爲參數,而不是列名,你」 d首先要使用GetOrdinal緩存索引。

並且已經建議Patrick,請嘗試改進您的命名約定。