Что означает "+" в отраженном FullName и "*" после члена С#

В настоящее время я занимаюсь размышлением в С#. После:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetTypes()

И я нашел это: [System.Numerics.Matrix4x4], [System.Numerics.Matrix4x4+CanonicalBasis], [System.Numerics.Matrix4x4+VectorBasis] (Есть отраженные типы из "System.Numerics.Vectors.dll") Я знаю что Matrix4x4 является структурой, однако я не могу найти информацию о CanonicalBasis и VectorBasis, и что означает "+" в этом контексте. Я занимался дальнейшими исследованиями, и еще одна странная вещь:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").FullName
"System.Numerics.Matrix4x4+VectorBasis"

Но:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").Name
"VectorBasis"

Более того, когда я просматривал элементы Matrix4x4 + VectorBasis, есть такой элемент:

[System.Numerics.Vector3* Element0] 

И это необработанный указатель, как в c++? Или что это?

PS Я делал это в С# interactive, но я не думаю, что это повлияло на результаты.

Ответ 1

Названия + между классами означают, что часть после + является вложенным типом типа, имя которого находится до +. Например, Dictionary<string, string>+KeyCollection. KeyCollection - это внутренний класс Dictionary<TKey, TValue>.

* Обозначает указатель, так как указанное поле находится в небезопасном режиме:

public unsafe Vector3* Element0;

Ответ 2

В строке System.Numerics.Matrix4x4+VectorBasis + означает, что VectorBasis является вложенным типом Matrix4x4. В этом конкретном случае VectorBasis является вложенной struct внутри class. Обратите внимание, что + - это тот же символ, который не имеет значения, с какими типами вложенных типов вы имеете дело:

class A
{
    public class B {}
}

struct A
{
    public struct B {}
}

class A
{
    public enum B {}  
}

Все вложенные типы в этих примерах имеют одно и то же FullName, A+B

В вашем случае VectorBasis и CanonicalBasis являются private членами, поэтому вы не можете видеть их через Type.GetNestedTypes() который показывает только public члены.


* После System.Numerics.Vector3* означает, что это тип указателя. Строка происходит от Type экземпляра FieldInfo.FieldType собственности.


Вы можете просмотреть это и другие возможные строковые представления класса Type на соответствующей странице документации MSDN.