Как преобразовать ненулевой тип в обнуляемый в C ++ / CLI? - PullRequest
2 голосов
/ 17 ноября 2011

Как преобразовать ненулевой тип в обнуляемый в C ++ / CLI?

Я знаю, как это сделать в C #:

public Type GetNullableType(Type t)
{
    return typeof(Nullable<>).MakeGenericType(t);
}

Но я не могу понять, как преобразовать его в C ++ / CLI.

Я пробовал это, но когда я компилирую код, я получаю внутреннюю ошибку компилятора.

Type^ nullableType = Nullable<>.GetType();
return nullableType->MakeGenericType(t);

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Еще один менее хрупкий обходной путь:

static Type^ GetNullableType(Type^ t)
{
    Type^ nullable = Nullable<int>::typeid->GetGenericTypeDefinition();
    return nullable->MakeGenericType(t);
}
1 голос
/ 17 ноября 2011

Во-первых, вместо C # typeof() вы используете typeid в C ++. Итак, typeof(int) становится int::typeid.

Во-вторых, при ссылке на универсальные типы кажется, что вы просто опускаете угловые скобки. Итак, typeof(List<>) становится List::typeid.

Проблема в том, что вы не можете указать количество аргументов типа. И Nullable::typeid возвращает тип неуниверсального статического класса Nullable, а это не то, что нам нужно.

Я не нашел способа получить тип напрямую из C ++ / CLI. Но вы всегда можете использовать Type.GetType():

Type^ nullableType = Type::GetType("System.Nullable`1");
return nullableType->MakeGenericType(t);

(`1 - это способ, который внутренне использует .Net для различения типов с различным количеством аргументов типа.)

Это перестанет работать, если тип Nullable<T> когда-либо будет перемещен из mscorlib, но я сомневаюсь, что это произойдет.

...