C # - статические типы нельзя использовать в качестве аргументов типа - PullRequest
24 голосов
/ 02 мая 2011

У меня есть универсальный класс, который помогает мне проверять значения аргументов

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;
}

Iполучил эту ошибку (при компиляции):

статические типы нельзя использовать в качестве аргументов типа

Что я делаю не так?

Ответы [ 5 ]

29 голосов
/ 02 мая 2011

Это преднамеренно.

Статические классы пытаются предотвратить нецелевое использование, поэтому почти во всех ситуациях вы не можете использовать их в ситуациях, когда вам обычно требуется экземпляр изтип ... и включает аргументы типа.

См. раздел 10.1.1.3.1 спецификации C # 4 для очень ограниченного набора ситуаций, в которых вы можете ссылаться на статический класс.типы.

5 голосов
/ 02 мая 2011

Обобщения работают только с экземплярами, а не со статическими классами.

2 голосов
/ 02 мая 2011

Поскольку статические классы не могут быть созданы, он никогда не сможет создать Argument<T> со статическим типом.

0 голосов
/ 02 мая 2011

Поскольку у статических классов не будет элементов-экземпляров, меня будет беспокоить, что я собираюсь с ними делать.

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

0 голосов
/ 02 мая 2011

То, что вы делаете неправильно, использует статический тип в качестве аргумента универсального типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...