Nullable(int?)继续抛出不可为空的异常

时间:2013-04-10 17:59:51

标签: c# asp.net

这是我第一次遇到这种情况 - 当然这并不是很多,但我从不需要与集体协商作为我的搜索,同时表明它可以完成,我不是能够解决它。

问题是,如果用户将文本框留空,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'例外。

为什么这么该死的顽固?

6 个答案:

答案 0 :(得分:5)

要非常直接,ia.PageNumber无法引用您提供的定义,因为以下代码不仅编译,并运行,而且写出{{1 }}:

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 _PageNumber不是int?。为了进一步具体化我的立场,以下代码:

int?

抛出预期的异常:

  

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

所以问题也不能是填充字符串。最后具体我的立场,以下代码:

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

抛出预期的异常:

  

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

因此问题也不能是空字符串。根据{{​​1}}您可能正在转换PageNumber = Convert.ToInt32(""); Console.WriteLine("Setting to value {0}.", PageNumber); 的评论进一步具体说明这个位置,实际上是按预期成功的,以下代码:

jadarnel27

实际上,编译,运行并且不会执行任何操作。它按预期输出字符串null

答案 1 :(得分:4)

我会尝试以下方法:

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

空字符串和空字符串是两个不同的东西,因此具有空值的字符串可能会在您的代码中滑落。

答案 2 :(得分: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);

答案 3 :(得分:1)

好的人,你会为此杀了我。

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

这是我第一次使用多个项目的解决方案,我没有理由去编译单个项目(我使用的是Visual Studio 2010)。

嗯,经验教训。非常感谢所有贡献者。

答案 4 :(得分:0)

试试这个:

ia.PageNumber = (int?)null;

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

答案 5 :(得分:0)

CS0019:运算符'=='无法应用于'object'和'int'类型的操作数

尝试将此0设为“0”

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

无法将null转换为'int',因为它是一个不可为空的值类型

不要在pagenumber中使用null。因为pagenumber属性只获取整数值。但是null不是整数。所以你得到了上面的错误。但是现在我从null更改为0