Просто странность, которую я обнаружил, когда я размышлял над всеми типами, чтобы проверить что-то еще из любопытства.
Почему класс System.__ComObject
сборки mscorlib.dll
(иногда?) утверждает, что он является общедоступным, когда на самом деле он выглядит непубличным? Если я запустил следующий код в простом консольном приложении С#:
var t = Type.GetType("System.__ComObject");
Console.WriteLine(t.IsPublic); // "True" ?!
Console.WriteLine(t.IsVisible); // "False"
вывод кажется противоречивым. Не вложенный тип (t.IsNested
is false) должен давать одинаковое значение истинности для IsPublic
и IsVisible
. Когда я смотрю на сборку с IL DASM
, я вижу:
.class private auto ansi beforefieldinit System.__ComObject
extends System.MarshalByRefObject
{
} // end of class System.__ComObject
который, по моему мнению, очень похож на непубличный класс, что соответствует коду С# ниже:
namespace System
{
// not public
internal class __ComObject : MarshalByRefObject
{
...
}
}
Когда я сравниваю с другим типом с похожим именем, System.__Canon
и аналогичными IL-модификаторами, как IsPublic
, так и IsVisible
возвращает false, как ожидалось.
Кто-нибудь знает, почему (и когда) Type.GetType("System.__ComObject").IsPublic
дает true?