“is”和“IsAssignableFrom”C#之间的区别

本文关键字:区别 之间 IsAssignableFrom is | 更新日期: 2023-09-27 18:23:43

两者之间有什么区别:

typeof(IInterface).IsAssignableFrom(typeof(Class));

typeof(Class) is IInterface

编辑:对于上下文,我的函数是这样的:

public static List<T> GetAllInstancesOfType<T>() where T:Entity
{
  List<T> l = new List<T>();
  if (typeof(IMyInterface).IsAssignableFrom(typeof(T)) //or (typeof(T) is IMyInterface)
     foreach(Entity e in List1) if (e is T) l.Add(e as T);
  else foreach (Entity e in List2) if (e is T) l.Add(e as T);
  return l;
}

“is”和“IsAssignableFrom”C#之间的区别

它们看起来很相似,但在概念上却非常不同。前者回答了"如果我有这种类型的变量,我可以给它赋一个这种类型的吗?

后者回答了"这个实际值可以通过引用或装箱转换转换为此类型吗?

在后一种情况下,实际对象是 Type 类型的对象,而不是 Class 类型的对象。 确保您了解以下各项之间的区别:

Type t = typeof(Class);
Class c = new Class();
bool b1 = t is IInterface;
bool b2 = c is IInterface;

第一个问题问"Type对象可以转换为接口吗?"第二个问题问"Class对象可以转换为接口吗?">

一些区别:

答:使用 IsAssignableFrom,您不需要任何对象实例(仅 System.Type 对象(,这在反射过程中非常有用。

B:使用 is 关键字,如果类型始终/从不兼容(至少与锐化器兼容(,则获取一些编译时提示

C:他们有点相反。IsAssignableFrom 检查作为参数传递的类型的对象是否可以分配给其他类型的变量。is 关键字检查关键字左侧的对象是否可以分配给关键字右侧类型的变量。

typeof(Class) is IInterface的计算结果总是false,因为typeof(Class)的类型是RuntimeType。正确的使用方法是在给定类的实例上,例如

Class c = // something
bool isIt = c is IInterface;

当您想知道值是否可转换为编译时已知的类型时,应使用is

当一种或两种类型仅在运行时已知时,应使用IsAssignableFrom。 F.D. someType.IsAssignableFrom(someOtherType) .如果在编译时两种类型都是已知的,例如 typeof(IInterface).IsAssignableFrom(typeof(Class));,你可以通过查找Class的定义来知道答案,并且在运行时检查它并没有真正的意义。