为什么'is'运算符不能与泛型类型参数一起使用?

时间:2019-07-16 19:21:30

标签: c#

背景:我编写了一个通用方法,该方法从集合中查找并返回由通用类型参数指定的特定类型的对象。

我发现,由于某种原因,即使对象的类型和作为通用类型参数传递的类型相同,“ is”运算符也会返回“ false”。

public abstract class AbstractComponent { }
public class Component : AbstractComponent { }

//Collection
public List<AbstractComponent> Components = new List<AbstractComponent> { new Component() };

//Method
public ComponentType GetComponent<ComponentType>()
{
    foreach (var component in Components)
    {
        var type = component.GetType();
        var eq = type is ComponentType; // false
        var eq2 = type == typeof(ComponentType); // true
        var eq3 = Type.Equals(type, typeof(ComponentType)); // true

        //Updated
        var eq4 = component is ComponentType; // also true, thanks for that
    }
    return default(ComponentType);
}

//Method invocation
var Component = GetComponent<Component>();

我将使用其他方式,但是我想知道为什么正是这种行为发生。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

type不是ComponentType的实例,它是Type的实例,因此is将不起作用。

例如,您想IsAssignableFrom

typeof(ComponentType).IsAssignableFrom(type)