В этом случае, я думаю (по крайней мере, по большей части), вы правы, и это неправильно. Стандарт описывает logic_error
как:
Класс logic_error определяет тип объектов, которые были выбраны как исключения для сообщения ошибок, предположительно обнаруживаемых до выполнения программы, таких как нарушения логических предпосылок или инвариантов классов.
blockquote>Аргумент командной строки, который не может быть проанализирован, похоже, не очень хорошо подходит.
В отличие от этого, он описывает
runtime_error
как:Класс runtime_error определяет тип объектов, которые были выбраны как исключения для отчетов об ошибках, предположительно обнаруживаемых только тогда, когда программа выполняется.
blockquote>Кажется, что это лучше подходит.
Я вижу, вы уже приняли ответ, но, честно говоря, этого ответа будет недостаточно, чтобы сделать это надежно, если вы просто объедините то, что там, с то, что вы уже написали. Это на правильном пути, но ваш код будет работать только для универсальных типов с одним универсальным параметром, и он будет работать только в том случае, если сам параметр универсального типа не является универсальным!
Это функция (написанная как метод расширения), которая действительно должна работать во всех случаях:
public static class TypeExtensions
{
public static string ToGenericTypeString(this Type t)
{
if (!t.IsGenericType)
return t.Name;
string genericTypeName = t.GetGenericTypeDefinition().Name;
genericTypeName = genericTypeName.Substring(0,
genericTypeName.IndexOf('`'));
string genericArgs = string.Join(",",
t.GetGenericArguments()
.Select(ta => ToGenericTypeString(ta)).ToArray());
return genericTypeName + "<" + genericArgs + ">";
}
}
Эта функция является рекурсивной и безопасной. Если вы запустите его на этом входе:
Console.WriteLine(
typeof(Dictionary<string, List<Func<string, bool>>>)
.ToGenericTypeString());
Вы получите этот (правильный) результат:
Dictionary<String,List<Func<String,Boolean>>>