С# - статические типы не могут использоваться как аргументы типа
У меня есть общий класс, который помогает мне делать проверки значений аргументов
internal sealed class Argument<T>
where T : class
{
private void TraceAndThrow(Exception ex)
{
new InternalTraceHelper<T>().WriteError(ex);
throw ex;
}
internal void ThrowNull(object value, string argName)
{
if (ReferenceEquals(value, null))
{
TraceAndThrow(new ArgumentNullException(argName));
}
}
internal void ThrowIf(bool condition, string argName)
{
if (condition)
{
TraceAndThrow(new ArgumentException(null, argName));
}
}
internal void ThrowNotInEnum(Type enumType, object value)
{
if (!Enum.IsDefined(enumType, value))
{
TraceAndThrow(new ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value)));
}
}
}
Но когда я пытаюсь использовать его со статическим классом:
internal static class Class1
{
private static Argument<Class1> _arg;
}
Я получил эту ошибку (при компиляции):
статические типы не могут использоваться как аргументы типа
Что я делаю неправильно?
Ответы
Ответ 1
Это преднамеренно.
Статические классы пытаются предотвратить неправильное использование, поэтому почти во всех ситуациях вы не можете использовать их в ситуациях, когда вы обычно хотите экземпляр типа... и который включает аргументы типа.
См. раздел 10.1.1.3.1 описания С# 4 для очень ограниченного набора ситуаций, в которых вы можете ссылаться на статические типы классов.
Ответ 2
Generics работает только с экземплярами, а не с статическими классами.
Ответ 3
Поскольку статические классы не могут быть созданы, он никогда не сможет создать Argument<T>
со статическим типом.
Ответ 4
Поскольку у статических классов не будет экземпляров-экземпляров, моя забота будет о том, что я буду с ними делать.
Я считаю, что, пропав, что вы не можете использовать статические классы в качестве общих аргументов, я считаю, что вам нужно это с помощью методов расширения вместо общего класса.
Ответ 5
То, что вы делаете неправильно, использует статический тип в качестве аргумента общего типа.