【问题标题】:why converting or parsing string to int return zero?为什么将字符串转换或解析为 int 返回零?
【发布时间】:2011-04-03 13:24:58
【问题描述】:

为什么将字符串转换/解析为int返回0/零?

在调试时,使用断点,我可以看到“3”作为字符串值发布到浏览操作,但是当我如上所述转换为 int 时,该值被转换为 int 类型的 0 值。

    //
    // GET: /Event/Browse
    public ActionResult Browse(string category)
    {
        int id = Convert.ToInt32(category);


        // Retrieve Category and its Associated Events from database
        var categoryModel = storeDB.Categories.Include("Events").Single(g => g.CategoryId == id);
        return View(categoryModel);
    }

请看下图以更好地理解:

另一个图像 - categoryModel 在 LINQ 查询中为空。

【问题讨论】:

  • 好吧,如果字符串是"0",那么将其转换为int 应该返回0。您是否有其他指示的特定代码示例?愿意分享吗?
  • 好的,这一切看起来都很好。但是在执行 TryParse() 行之后的同一件事的屏幕截图会更有帮助。
  • 只是预感-您在上图中意识到断点位于 Int32.TryParse 行上,即尚未执行,因此 id 仍为默认值 0。按F10(跨步),据我从其他当地人那里得知,它应该可以工作

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework-4


【解决方案1】:

来自 Int32.TryParse 上的 MSDN here

当这个方法返回时,包含 等效的 32 位有符号整数值 到 s 中包含的数字,如果 转换成功,或零,如果 转换失败。 转换 如果 s 参数为 nullptr,则失败, 格式不正确,或 表示小于 MinValue 的数字 或大于 MaxValue。这个 参数未初始化传递。

【讨论】:

    【解决方案2】:

    如果您的 Parse() 调用失败并且您的异常未被捕获,或者您没有测试 TryParse() 的返回值,那么 int 变量肯定会保持原样 - 默认情况下初始化为零。

    例如,这将使您的 int 保持为零:

    int i;
    Int32.Parse("FAIL!");
    // i is still a zero.
    

    所以试试这个:

    int i;
    bool parseSuccessful = Int32.TryParse("123", out i);
    // parseSuccessful should be true, and i should be 123.
    

    或者看到它优雅地失败:

    int i;
    bool parseSuccessful = Int32.TryParse("FAIL!", out i);
    // parseSuccessful should be false, and i should be 0.
    

    【讨论】:

    • 在您的第一个示例中,C# 将 i 视为未分配而不是 0
    • 根据微软这里 - msdn.microsoft.com/en-us/library/83fhsxwc%28v=vs.80%29.aspx 它默认为零。
    • 顺便说一句,C# 中不允许未赋值。
    • @Kon - 即使我将 id 初始化为零,我仍然得到相同的结果。
    • 您不需要将其初始化为零(尽管这样做可能是个好习惯) - 默认情况下会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多