Просто странность, которую я обнаружил, когда я размышлял над всеми типами, чтобы проверить что-то еще из любопытства.
Почему класс 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?