List <int>可从IEnumerable中分配吗?</int>

时间:2015-03-26 05:51:19

标签: c# .net types

在下面的示例中,如果something的类型为IEnumerable,我想抛出异常:

var something = new List<int>();

if (something.GetType().IsAssignableFrom(typeof(IEnumerable)))
{
    throw new ArgumentOutOfRangeException("Cannot create a key from type IEnumerable");
}

根据我的理解,IsAssignableFrom应该在上述情况下返回true,因为List<int>肯定是IEnumerable

4 个答案:

答案 0 :(得分:5)

您当前的代码会检查您是否可以将IEnumerable分配给List<int>,这就是它返回false的原因。

你需要反过来做这件事:

typeof(IEnumerable).IsAssignableFrom(something.GetType())

快速测试:

Console.WriteLine(typeof(IEnumerable).IsAssignableFrom(typeof(List<int>)));
Console.WriteLine(typeof(List<int>).IsAssignableFrom(typeof(IEnumerable)));

打印

True
False

答案 1 :(得分:1)

您可以使用以下方式之一:

if(something.GetType().GetInterfaces().Any(i => i == typeof(IEnumerable)))
    throw;

或者

if(something.GetType().IsAssignableTo<IEnumerable>())
    throw;

或者

if(typeof(IEnumerable).IsAssignableFrom(something.GetType())
   throw;

答案 2 :(得分:1)

试试这个

var something = new List<int>();    
 if (typeof(IEnumerable).IsAssignableFrom(something.GetType()))
 {
      throw new ArgumentOutOfRangeException("Cannot create a key from type IEnumerable");
 }

答案 3 :(得分:1)

为什么不使用is运算符?

var something = new List<int>();

if (something is IEnumerable)
{
    throw new ArgumentOutOfRangeException("Cannot create a key from type IEnumerable");
}