为何相同的代码结果却不一样?( C#)

2015-10-04 10:08:46 +08:00
 xxgirl2

写了个全角数字转半角数字的代码:

string raw_t = "@1 0 7".Substring(1);
string t = string.Concat(raw_t.ToCharArray()
    .Select(x => { if (x >= '0' && x <= '9') x ^= '\xFF20'; return x; })
);

在单独的 Console 测试里, 结果是正常的,
t 值为半角 "107".

但是在另外的 WinForm 程序里, Select 内的代码没有执行,
t 的结果是
"System.Linq.Enumerable+WhereSelectArrayIterator`2[System.Char,System.Char]".

而代码改为

string raw_t = "@1 0 7".Substring(1);
string t = string.Concat(raw_t.ToCharArray()
    .Select(x => { if (x >= '0' && x <= '9') x ^= '\xFF20'; return x + ""; })
    .ToArray()
);

之后, 在 WinForm 程序里结果就正常了.

请问这是怎么回事? 第一个版本的代码是否算一种隐藏的 Bug?

3123 次点击
所在节点    问与答
8 条回复
WalkingEraser
2015-10-04 11:14:59 +08:00
Java 的,没学过 c#,但看到变量加双引号转字符串就好想吐槽
Bryan0Z
2015-10-04 13:03:07 +08:00
@WalkingEraser 当 Java 看了遍没感觉有什么不对
xwing
2015-10-04 13:09:07 +08:00
我怀疑你在 winform App 中 using 的其他库中有扩展方法导致这个问题的。
abelyao
2015-10-04 13:39:46 +08:00
Console 输出变量的时候,有些类型是带有隐式转换为字符串的。你断点看看第一段代码中的 t 是什么结果呢?
xxgirl2
2015-10-04 18:39:32 +08:00
@xwing 用的都是官方库

@abelyao 第一段代码。 console 程序会进入 lambda 块执行,而 winform 程序没有进入 lambda 块,直接返回
xxgirl2
2015-10-04 18:41:21 +08:00
@WalkingEraser 第二段不加那玩意的话返回的依然是类型名称而不是内容。暂时不知道除了这个还有没有更简单的表达
abelyao
2015-10-04 21:45:10 +08:00
@xxgirl2 之前用手机看的帖,没看清楚,是我搞错了。想当年我也是会写 lambda 的现在都好久没写 .NET 了,楼主要是搞清楚原因了记得说一下哈。
mimzy
2015-10-05 22:16:44 +08:00
昨天看到这个问题 我刚才在自己的电脑上试了一下 在断点里控制台程序和 WinForm 程序都执行得没有问题



另外楼主你给的源代码里 107 这个数字实际上是 [全角 1][空格][半角 0][空格][全角 7] 我不知道这个是不是有意这样的...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/225511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX