我正在开发一款有趣的小型游戏,但偶然发现C#的is操作符令人困惑。这是代码:
public static InventorySlot FindSlotWithItem(this IInventory inventory, Type itemType)
{
return inventory.InventorySlots.FirstOrDefault(t => t is itemType);
}
就目前而言,此代码无法编译,因为我的Visual Studio告诉我找不到类型或名称空间名称“ itemType”。我想知道为什么会这样,并在MSDN上寻找了一些信息。这是我发现的:
is(C#参考):检查对象是否与给定类型兼容。例如,以下代码可以确定对象是MyObject类型的实例还是从MyObject派生的类型
这些行使我更加困惑,因为我显然将对象作为第一个参数,将类型作为第二个参数。我知道这与编译器寻找称为“ itemType”的类型有关,但这并不是我想要的行为。
请告诉我为什么这样的语法不起作用,为什么'is'运算符不将'itemType'视为类型。
这里的问题是Type
该类的对象与对该类的编译时常量引用不同。相反,Type
对象只是封装类的matadata的对象,因此不能用于直接创建变量,调用静态成员,作为泛型传递或以is
实际类引用的方式调用。
话虽如此,以上所有操作都有仅利用元数据的解决方法。对于类型比较,请尝试
t => itemType.IsAssignableFrom(t.GetType());
这将检查“是否itemType
可以为类型的变量分配类型的值t.GetType()
”-这将不仅检查类型,还可以很好地接受多态类型而不会产生任何抱怨。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句