写了个全角数字转半角数字的代码:
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?
1
WalkingEraser 2015-10-04 11:14:59 +08:00
Java 的,没学过 c#,但看到变量加双引号转字符串就好想吐槽
|
2
Bryan0Z 2015-10-04 13:03:07 +08:00 via Android
@WalkingEraser 当 Java 看了遍没感觉有什么不对
|
3
xwing 2015-10-04 13:09:07 +08:00
我怀疑你在 winform App 中 using 的其他库中有扩展方法导致这个问题的。
|
4
abelyao 2015-10-04 13:39:46 +08:00 via iPhone
Console 输出变量的时候,有些类型是带有隐式转换为字符串的。你断点看看第一段代码中的 t 是什么结果呢?
|
5
xxgirl2 OP |
6
xxgirl2 OP @WalkingEraser 第二段不加那玩意的话返回的依然是类型名称而不是内容。暂时不知道除了这个还有没有更简单的表达
|
7
abelyao 2015-10-04 21:45:10 +08:00
@xxgirl2 之前用手机看的帖,没看清楚,是我搞错了。想当年我也是会写 lambda 的现在都好久没写 .NET 了,楼主要是搞清楚原因了记得说一下哈。
|
8
mimzy 2015-10-05 22:16:44 +08:00
昨天看到这个问题 我刚才在自己的电脑上试了一下 在断点里控制台程序和 WinForm 程序都执行得没有问题
另外楼主你给的源代码里 107 这个数字实际上是 [全角 1][空格][半角 0][空格][全角 7] 我不知道这个是不是有意这样的... |