我IEnumerable<object>
类型变量。
IEnumerable<object> items= new object[] { 1, 2, 3 };
检查它是IEnumerable<int>
的最佳方式是什么?
我试过
typeof(IEnumerable<int>).IsAssignableFrom(items.GetType())
typeof(IEnumerable<int>).IsInstanceOfType(items)
items is IEnumerable<int>
但是, Re-Sharper 会抱怨所有这些。
就我而言,大多数情况下IEnumerable<object> items
的类型为IEnumerable<int>
。我希望在类型为IEnumerable<int>
时执行某些操作,而为其他类型执行其他操作。
答案 0 :(得分:12)
如果您想检查IEnumerable<object>
是否仅包含整数,可以使用Enumerable.All
:
var isInts = items.All(x => x is int);
答案 1 :(得分:6)
因为Valuetypes do not support co or contravariance。
IEnumerable<object>
不能是IEnumerable<int>
- 您自己证明了这一点,因为您必须使用强制转换来生成IEnumerable<object>
,这实际上包含了所有int值。因此,R#正确报告了可疑的类型检查,因为它源于您的操作,您的检查将始终返回false。
所以最后你需要在使用强制转换之前单独检查每个元素是否为int,否则你将遇到异常。
答案 2 :(得分:3)
应该照顾:
OfType :仅返回x。
类型的元素投放:会尝试将所有元素投射到x类型中。如果其中一些不是这种类型,您将获得InvalidCastException
items.Cast<int>();
或
items.OfType<int>();
答案 3 :(得分:1)
您不能将一个泛型转换为另一个,只是因为该类型是另一个的基类。因此,我们无法从document.write("<div id=\"marks\"></div>"); //destination div
remoteCounter('marks'); //invoking function
获得Enumerable<int>
。 Re-Sharper抱怨因为表达式永远不会返回。
你有
Enumerable<object>
也许您知道您的valueA是用整数填充的,但您也可以在IEnumerable<object> items= ((IEnumerable)valueA).Cast<object>();
中添加字符串或浮点数。因此,编译器无法确定该列表是否为可枚举的整数。
所以你必须创建一个新的可枚举,就像Peyman之前回答的那样(这不是一个新的列表,只是另一个可枚举的):
items
这将仅返回整数元素,并确保您可以获得items.OfType<int>();