在.NET for Windows商店应用程序中 - 似乎 - 你不能再使用字符串作为Enumerables了。以下代码适用于桌面应用程序,但不适用于应用程序:
public static bool SolelyConsistsOfLetters(string s)
{
return s.All(c => char.IsLetter(c));
}
错误是
'string'不包含'All'的定义,也没有扩展方法'All'接受'string'类型的第一个参数(你是否缺少using指令或汇编引用?)
但我没有错过装配参考或using System.Linq;
。以下代码可以工作:
public static IEnumerable<char> StringAsEnumerable(string s)
{
foreach (char c in s)
{
yield return c;
}
}
public static bool SolelyConsistsOfLetters(string s)
{
return StringAsEnumerable(s).All(c => char.IsLetter(c));
}
问题是,s as IEnumerable<char>
不起作用(错误:“无法将类型'字符串'转换为'System.Collections.Generic.IEnumerable'(...)”)并且s.GetEnumerator()
不可用
我的问题:
答案 0 :(得分:18)
.NET for Windows应用商店应用不支持String.IEnumerable<Char>.GetEnumerator
方法,但支持非通用String.IEnumerable.GetEnumerator
,这就是foreach
方法有效的原因。
基于此,我认为也应该可以这样做:
s.Cast<char>().All(c => char.IsLetter(c))
更新(关于Jani评论)
foreach
已经通过将每个变量定义为char
来执行强制转换。非泛型IEnumerable
版本返回对象,并且在编译时,从对象到任何其他类型的每个强制转换都是可接受的,这就是它工作的原因。
以下代码也可以正常编译,但在运行时会失败:
var valid = new object[] {'1', '2', '3'};
foreach (char c in valid)
Console.WriteLine(c);
var invalid = new object[] { 1, 2, 3 };
foreach (char c in invalid)
Console.WriteLine(c); // Fails at runtime; InvalidCastException