Nullable (int?)不断抛出非空异常
本文关键字:异常 int Nullable | 更新日期: 2023-09-27 18:08:25
这是我第一次遇到这种情况-当然这并没有说很多,但我需要与集体协商,因为我的搜索虽然表明它可以做到,但我无法解决。
问题是,如果用户让文本框为空,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
所以我想如果我不能改变类型,也许我可以改变输出。所以我想也许我可以把它放在textbox的text属性中:
'<%# Eval("PageNumber") == 0 ? null:Eval("PageNumber") %>'
抛出CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int'
异常。
为什么这么固执??
更直接地说,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);
实际上不会编译、运行,也不会抛出异常。它按预期输出字符串Setting to value 0.
。
我会尝试如下:
if (!string.IsNullOrEmpty(tbPageNumber.Text))
ia.PageNumber = Convert.ToInt32(tbPageNumber.Text);
else
ia.PageNumber = null;
空字符串和空字符串是两种不同的东西,因此带有空值的字符串可能会在您的代码中溜过。
我为此做了一个扩展方法,它在值类型的情况下帮助我解决了很多与web相关的字符串转换:
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);
好了,各位,你们会为此杀了我的。
问题是ia.PageNumber
在解决方案的单独项目中声明的类,由于某种原因它没有编译,因此关于编译时问题的注释。
这是我使用过的多个项目的第一个这样的解决方案,我没有理由考虑编译单个项目(我使用Visual Studio 2010)。
好吧,我吸取教训了。非常感谢所有做出贡献的人。
CS0019:操作符'=='不能应用于'object'和'int'类型的操作数
试试这个0到"0"
'<%# Eval("PageNumber") == "0" ? 0:Eval("PageNumber") %>'
不能将null转换为'int',因为它是一个不可空的值类型
不要在pagenumber
中使用null .因为pagenumber
属性只能得到整数值。但是null不是整数。就得到了上面这个误差。但是现在我把null改成了0
试试这个:
ia.PageNumber = (int?)null;
编辑:我在想一个不同的问题…尽管提供了示例代码,该错误表明ia.PageNumber
是int
,而不是int?
。