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'异常。

为什么这么固执??

Nullable (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.PageNumberint,而不是int?