2013-04-10 66 views
3

这是我遇到过的第一个 - 当然不会太好,但从来就不需要像集体一样查询我的搜索表明它可以完成,我无法解决它。可空(int?)继续抛出不可为空的异常

问题是,如果用户离开文本框为空,C#会自动在回发和数据库中输入零。我只是想让文本框留空。

我有一个类有属性声明:

private int? _PageNumber = null; 

public int? PageNumber 
{ 
    get { return _PageNumber; } 
    set { _PageNumber = value; } 
} 

的在我的代码文件中我有:

if (tbPageNumber.Text != "") 
     ia.PageNumber = Convert.ToInt32(tbPageNumber.Text); 
    else 
     ia.PageNumber = null; 

,这是我得到的异常:

CS0037: Cannot convert null to 'int' because it is a non-nullable value type 

所以我想如果我不能改变类型,也许我可以改变输出。所以我想也许我可以通过将该在texbox的text属性假货:

'<%# Eval("PageNumber") == 0 ? null:Eval("PageNumber") %>' 

这将引发CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int'异常。

为什么这么该死的固执?

+4

这听起来不像是一个异常 - 这听起来像一个编译时问题。你可以在一个简短但完整的控制台应用程序中重现这一点,从ASP.NET的任务中完成任务吗? – 2013-04-10 18:01:45

+0

CS0037看起来更像编译器错误,而不是异常。有一个非常大的差异。 – 2013-04-10 18:01:54

回答

1

好的人,你会杀了我的。

问题在于ia.PageNumber在解决方案中的一个单独项目中声明的类,由于某些原因它没有编译,因此提供了有关编译器时间问题的注释。

这是第一个这样的解决方案,它包含多个与我一起工作过的项目,我没有理由去编译单个项目(我使用Visual Studio 2010)。

那么,经验教训。非常感谢所有人的贡献。

4

我会尝试以下方法:

if (!string.IsNullOrEmpty(tbPageNumber.Text)) 
    ia.PageNumber = Convert.ToInt32(tbPageNumber.Text); 
else 
    ia.PageNumber = null; 

空字符串和一个空字符串是两回事,因此与空值的字符串可以通过您的代码出现打滑。

+2

但问题不在于'null'或'empty'字符串,这都是关于如何在'int'数据类型中保存'null'。 – Shaharyar 2013-04-10 18:09:49

+0

这个解决方案的问题是'OP'出现编译器错误。底线是'ia.PageNumber' **不是**'int?'。 – 2013-04-10 18:16:57

+0

@ jvanh1,这实际上是不可能的。请看我的答案。 – 2013-04-10 18:22:35

0

试试这个:

ia.PageNumber = (int?)null; 

编辑:我想不同的问题。该错误表明ia.PageNumberint,而不是一个int?,尽管提供的示例代码。

+1

它会造成什么区别? – 2013-04-10 18:11:45

+0

我试过之前 - 没有工作。 – Risho 2013-04-10 18:57:33

5

要非常简单,有没有办法,ia.PageNumber是指你提供,因为下面的代码不仅编译,并运行定义,但写出Setting to NULL.

private int? _PageNumber = null; 

public int? PageNumber 
{ 
    get { return _PageNumber; } 
    set { _PageNumber = value; } 
} 

if (string.Empty != "") 
{ 
    PageNumber = Convert.ToInt32(string.Empty); 
    Console.WriteLine("Setting to value."); 
} 
else 
{ 
    PageNumber = null; 
    Console.WriteLine("Setting to NULL."); 
} 

底部行是ia.PageNumber不是int? _PageNumber不是int?。为了更具体的我的位置,下面的代码:

PageNumber = Convert.ToInt32(" "); 
Console.WriteLine("Setting to value {0}.", PageNumber); 

抛出预期的异常:

输入字符串的不正确的格式。

所以问题不能是填充字符串。并最终混凝土我的位置,下面的代码:

PageNumber = Convert.ToInt32(""); 
Console.WriteLine("Setting to value {0}.", PageNumber); 

抛出预期的异常:

输入字符串的不正确的格式。

所以问题不能是空字符串。并进一步具体根据由jadarnel27提出的意见,你可能会转换null这个位置,实际上成功的预期,下面的代码:

PageNumber = Convert.ToInt32(null); 
Console.WriteLine("Setting to value {0}.", PageNumber); 

实际上,编译,运行,并且没有抛出execption。按预期输出字符串Setting to value 0.

+0

如果tbPageNumber。文本是空的,然后OPs代码在null上调用Convert.ToInt32,这看起来可能是他遇到的问题。他的if检查不包含空值,仅用于空值。 – jadarnel27 2013-04-10 18:19:44

+0

@ jadarnel27,这实际上是不正确的,请参阅我的编辑。 – 2013-04-10 18:22:08

+0

啊。我的错。我以为我记得转换null不起作用,但我从文档看到这是不正确的。 – jadarnel27 2013-04-10 18:24:18

0

CS0019:运算符 '==' 不能应用于类型 '对象' 和 '廉政' 的操作数

试试这个0为 “0”

'<%# Eval("PageNumber") == "0" ? 0:Eval("PageNumber") %>' 

无法转换为null 'int',因为它是非空值类型

请勿在pagenumber中使用null。因为pagenumber属性只获取整数值。但null不是一个整数。所以,你得到这个上面error.But 现在我从零变为0

+0

我不想显示零。 – Risho 2013-04-10 18:57:57

2

我给这个扩展方法,帮助了我很多与这些网站相关的字符串转换的值类型的情况下:

public static class ExtensionMethods 
{ 
    public static T As<T>(this string input, T fallback = default(T), 
          IFormatProvider provider = null) 
    { 
     var type = Nullable.GetUnderlyingType(typeof(T)); 
     if (type == null) 
      type = typeof(T); 
     T result; 
     try 
     { 
      result = (T)Convert.ChangeType(input, type, provider); 
     } 
     catch(Exception) 
     { 
      result = fallback; 
     } 
     return result; 
    } 
} 

而且使用这样的:

ia.PageNumber = tbPageNumber.Text.As<int>(); 
ia.PageNumber = tbPageNumber.Text.As<int?>(); 
ia.PageNumber = tbPageNumber.Text.As<int?>(10);