• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

object转List,在断点监视时有值,实际运行是=null,这是为什么

张天星 C# .Net开发  2020-12-27 07:24:09

[TestMethod()]
public void Object转List测试()
{
List<int> test = new List<int> { 1, 2, 3, 4, 6 };
var obj = (object)test;
//运行的时候,List=null,在断点监视的时候,(obj as IEnumerable<object>)有值
var list = obj as IEnumerable<object>;
}

从图片上可以看出来,赋值之后的List是null.
但是,断点监视的时候,obj as IEnumerable<object>有值。。。
这是为啥啊。。
...全文
2106 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
datafansbj 2020-12-28
list 在赋值后,再也没有被使用过,编译器认为无用,给优化掉了。
后面加上类似 if (list == null) 的语句就可以了。
回复
Denuin 2020-12-28
引用 2 楼 Denuin 的回复:

var list = obj as IEnumerable<int>;
这个确实可以,但是List里面有可能是string的,所以我才用object来通用。[/quote] 直接强转:

 var list = (IEnumerable) obj;
回复
∽油条á 2020-12-28
引用 6 楼 datafansbj 的回复:
[quote=引用 5 楼 ∽油条á 的回复:][quote=引用 3 楼 datafansbj 的回复:]list 在赋值后,再也没有被使用过,编译器认为无用,给优化掉了。 后面加上类似 if (list == null) 的语句就可以了。
你是认真的吗?[/quote] 绝对认真,不信自己测试。默认条件下编译器视无用的语句为废话,不会编译它,在 debug 模式下只能显示初始的值(null)。当然你可以修改编译配置参数,不进行优化。[/quote] 来解释一下这是为啥?
回复
datafansbj 2020-12-28
另外注意:
List a = List<string>;
var obj1 = a as object;
var obj2 = a as IEnumerable<string>;
var obj3 = a as IEnumerable<object>;

详见“协变”。
回复
datafansbj 2020-12-28
引用 5 楼 ∽油条á 的回复:
[quote=引用 3 楼 datafansbj 的回复:]list 在赋值后,再也没有被使用过,编译器认为无用,给优化掉了。
后面加上类似 if (list == null) 的语句就可以了。


你是认真的吗?[/quote]

绝对认真,不信自己测试。默认条件下编译器视无用的语句为废话,不会编译它,在 debug 模式下只能显示初始的值(null)。当然你可以修改编译配置参数,不进行优化。
回复
∽油条á 2020-12-28
引用 3 楼 datafansbj 的回复:
list 在赋值后,再也没有被使用过,编译器认为无用,给优化掉了。 后面加上类似 if (list == null) 的语句就可以了。
你是认真的吗?
回复
张天星 2020-12-28
引用 3 楼 datafansbj 的回复:
list 在赋值后,再也没有被使用过,编译器认为无用,给优化掉了。 后面加上类似 if (list == null) 的语句就可以了。
不是优化的原因,方法都还没有运行完
引用 1 楼 xiaoliangoo 的回复:
可能是局部变量生命周期
方法都没走完,局部变量还没结束。
引用 2 楼 Denuin 的回复:

var list = obj as IEnumerable<int>;
这个确实可以,但是List里面有可能是string的,所以我才用object来通用。
回复
Denuin 2020-12-27

var list = obj as IEnumerable<int>;
回复
xiaoliangoo 2020-12-27
可能是局部变量生命周期
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-12-27 07:24
社区公告

让您成为最强悍的C#开发者