获取“<null>”和“System.DateTime”之间没有隐式转换“错误消息</null>

时间:2012-02-22 16:40:03

标签: c# .net-3.5 c#-3.0 asmx asp.net-3.5

在上一个问题中:

Getting "This method or property cannot be called on Null values" error

我遇到以下代码的问题:

client_group_details.Add(new ClientGroupDetails(
    reader.GetString(Col2Index),
    reader.GetString(Col3Index)));

我收到以下错误:

Data is Null. This method or property cannot be called on Null values.

使用以下代码解决了此问题:

client_group_details.Add(new ClientGroupDetails(
    reader.IsDbNull(Col2Index) ? null : reader.GetString(Col2Index),
    reader.IsDbNull(Col3Index) ? null : reader.GetString(Col3Index)));

我现在遇到与GetDateTimeGetInt32类似的问题,例如:

client_group_details.Add(new ClientGroupDetails(
    reader.GetString(Col2Index),
    reader.GetString(Col3Index),
    reader.GetDateTime(Col4Index)));

我尝试使用以下方法来解决此问题,但它没有工作

client_group_details.Add(new ClientGroupDetails(
    reader.IsDbNull(Col2Index) ? null : reader.GetString(Col2Index),
    reader.IsDbNull(Col3Index) ? null : reader.GetString(Col3Index),
    reader.IsDbNull(Col2Index) ? null : reader.GetDateTime(Col4Index)));

它给出错误:

Compiler Error Message: CS0173: Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'System.DateTime'

在搜索解决方案后,我发现:Nullable type issue with ?: Conditional Operator。但是当我尝试使用该代码时,我不断获得) expected

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

DateTimestruct,因此是值类型,不能是null。只有引用类型和Nullable<>类型可以为null。您必须使用Nullable<DateTime>。这也可以写成DateTime?

DateTime? dt = null;
dt = DateTime.Now;
if (dt.HasValue) ...
if (dt == null) ...
DateTime x = dt.Value;

dt = reader.IsDBNull(Col2Index) ? (DateTime?)null : reader.GetDateTime(Col4Index);

答案 1 :(得分:8)

你错过了一个关闭括号。

client_group_details.Add(new ClientGroupDetails(
    reader.IsDbNull(Col2Index) ? null : reader.GetString(Col2Index),
    reader.IsDbNull(Col3Index) ? null : reader.GetString(Col3Index),
    reader.IsDbNull(Col2Index) ? null : reader.GetDateTime(Col4Index)));

应该改为

client_group_details.Add(new ClientGroupDetails(
    reader.IsDbNull(Col2Index) ? null : reader.GetString(Col2Index),
    reader.IsDbNull(Col3Index) ? null : reader.GetString(Col3Index),
    reader.IsDbNull(Col2Index) ? (DateTime?)null : reader.GetDateTime(Col4Index)));

或类似的东西。根据您的确切代码,某人可以告诉您缺少括号的位置。