You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#中foreach遍历double枚举时可使用int变量?

为何C#中foreach遍历double集合时可以直接声明int变量,而直接赋值却报错?

这是C#的特性,不是bug,核心差异源于foreach语句的编译规则和普通赋值语句的类型转换限制:

1. foreach的自动显式转换逻辑

当你写foreach (int x in doubleEnumerable)时,编译器会自动处理类型转换:

  • 先获取集合的枚举器,遍历每个double类型的元素
  • 自动插入显式强制转换,把double元素转为int后赋值给迭代变量x

编译器生成的等效代码大致如下:

using (var enumerator = doubleEnumerable.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        // 编译器自动添加了显式转换(int)
        int x = (int)enumerator.Current;
        /* Do sth. */
    }
}

2. 普通赋值的转换限制

在int x = tmp这种普通赋值场景中,C#类型系统明确规定:double到int的转换属于显式转换(可能丢失小数精度或触发溢出),不允许隐式执行。必须手动添加(int)tmp的强制转换才能通过编译,否则就会抛出CS0266错误。

注意事项

虽然foreach的自动转换很便捷,但要注意它会直接截断double的小数部分,不会做四舍五入;如果集合中存在超出int取值范围的double值,运行时可能抛出OverflowException(除非关闭溢出检查)。


内容的提问来源于stack exchange,提问作者Xlea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:07:02