假设有两个具有相同名称空间的程序集。它们每个都包含一个具有相同名称的类,但每个程序集中有不同的方法。
如果我在另一个程序集中加载它们,并创建这个类的实例(每个程序集中一个),IsAssignableFrom
在两个类的实例之间是否返回true ?
我只是好奇结果会是什么。
另外,是否有可能将A的实例分配给B?
在此场景中,编译前没有引用任何程序集,也没有强名称。
首先,这应该能够测试你自己,所以"向我们展示你做了什么"的so心态应该在这里发挥作用。没有必要问这个特定的问题。
现在,你可能会有一个关于的问题,为什么不容易从简单的实验中推断出规则,所以这里是…这里有几个问题,让我们一个一个地回答:
IsAssignableFrom
在两个类的实例之间是否返回true
不,它不会,除非两个类中的一个从另一个继承,并且您以正确的方式询问IsAssignableFrom
。
两个类"在同一个命名空间中"并且具有相同的名称,这并不使它们的赋值兼容。
有可能将A的实例赋值给B吗?
不,它不会,除非(再次)其中一个继承了另一个,并且您为正确的变量类型分配了正确的对象类型。
与另一个相同,它们不兼容赋值,只是因为它们在相同的命名空间中并且具有相同的名称。
类的标识也绑定到它所在的程序集。由于A
和B
必须在单独的程序集中,它们不是同一个类。
a.IsAssignableFrom(b)
将返回true
,如果以下任何一个是true
:
-
b
继承自a
(不需要直接,可以是几个级别之间) -
a
是一个接口,b
是实现该接口的类型 -
a
是一个可空类型,b
是该类型的非可空版本
有一些关于泛型类型的附加信息我不理解,但这些都不适用于您的情况
你的类型只能赋值给你的另一个类型,如果它实际上是那个类型,或者继承了那个类型。
IsAssignableFrom
方法返回:
"如果c和当前类型代表相同的类型,或者当前类型在c的继承层次结构中,或者如果当前Type是c实现的接口,或者如果c是泛型类型参数,当前Type表示c的约束之一,或者如果c表示值类型,而当前类型表示Nullable
(在Visual Basic中可为空(Of c))。"
在你的例子中,只有前两个条件适用。
一个类型与另一个类型具有相同的名称和名称空间并不会使它们成为相同的类型,也不会在类型之间创建任何类型的关系。
(同样,一个类的实例不能被赋值给另一个类的实例。对于引用类型,将实例分配给引用变量,而不是实例。当你将一个实例赋值给一个变量时,是变量的类型决定了是否可以进行赋值,而不是变量当前引用的实例的类型。