0

假设有两个具有相同名称空间的程序集。它们中的每一个都包含一个具有相同名称的类,但每个程序集中有不同的方法。

如果我将它们都加载到另一个程序集中,并创建此类的一个实例(每个程序集中一个),是否会IsAssignableFrom在两个类的实例之间返回 true?

我只是好奇会是什么结果。

另外,是否可以将 A 的实例分配给 B?

在这种情况下,在编译之前没有任何程序集被引用,也没有强名称。

4

2 回答 2

4

首先,这应该可以测试你自己,所以 SO 心态的“向我们展示你做了什么”部分应该在这里发挥作用。应该没有必要问这个特定的问题。

现在,您最终可能会遇到一个问题,为什么从简单的实验中推断出规则是不容易的,所以这里......

这里有几个问题,所以让我们一一回答:

IsAssignableFrom在两个类的实例之间返回 true

不,它不会,除非两个类中的一个继承自另一个并且您IsAssignableFrom以正确的方式询问。

这两个类“在同一个命名空间中”并且具有相同的名称并不使它们的分配兼容。

是否可以将 A 的实例分配给 B?

不,它不会,除非(再次)其中一个继承自另一个,并且您将正确类型的变量分配给正确类型的对象。

与另一个相同,它们不是分配兼容的,只是因为它们在同一个命名空间中并且具有相同的名称。

一般信息

一个类的标识也绑定到它所在的程序集中。因为A并且B必须在单独的程序集中,所以它们不是同一个类。

a.IsAssignableFrom(b)true如果以下任何一项将返回true

  • b继承自a(不一定是直接的,可以是几个层次之间)
  • a是一个接口并且b是实现该接口的类型
  • a是可空类型,并且b是该类型的不可空版本

还有一些关于泛型类型的附加信息我不明白,但这些都不适用于您的情况。

于 2013-06-08T19:13:08.213 回答
2

如果您的类型实际上是该类型或继承该类型,则您的类型只能分配给您的其他类型。

IsAssignableFrom方法返回:

"如果 c 和当前 Type 表示相同的类型,或者如果当前 Type 在 c 的继承层次结构中,或者如果当前 Type 是 c 实现的接口,或者如果 c 是泛型类型参数和当前 Type,则为 true表示 c 的约束之一,或者如果 c 表示值类型并且当前 Type 表示 Nullable<c>(在 Visual Basic 中为 Nullable(Of c))。"

在您的情况下,只有前两个条件适用。

一种与另一种类型具有相同名称和命名空间的类型不会使它们成为相同类型,或者根本不会在类型之间创建任何类型的关系。

(此外,一个类的实例不能分配给另一个类的实例。对于引用类型,您将实例分配给引用变量,而不是实例。当您将实例分配给变量时,它是确定是否可以进行赋值的变量,而不是变量当前引用的实例的类型。)

于 2013-06-08T19:18:57.527 回答