Обобщения для проверки параметров метода c # - PullRequest
1 голос
/ 26 февраля 2012

Итак, я настроил проверку параметров C #, используя метод, описанный в этом сообщении в блоге. Все отлично работает для strings, для которого у меня есть установка этого метода расширения на основе всего этого:

public static ArgumentEx<T> NotEmptyString<T>(this ArgumentEx<T> arg) where T : class
{
    if (string.IsNullOrWhiteSpace(arg.Value.ToString()))
    {
        throw new ArgumentException(string.Format("{0} cannot be empty.", arg.Name));
    }
    return arg;
}

Однако, когда я пытаюсь добавить метод расширения для ints, чтобы определить, меньше или равны ли они нулю, например:

public static ArgumentEx<T> NotZeroOrLess<T>(this ArgumentEx<T> arg) where T : class
{
    if (Convert.ToInt32(arg.Value.ToString()) <= 0)
    {
        throw new ArgumentException(string.Format("Please make sure {0} is greater than zero.", arg.Name));
    }
    return arg;
}

Я получаю эту ошибку, когда пытаюсь назвать ее так userId.RequireThat("userId").NotZeroOrLess();

Тип int должен быть ссылочным типом, чтобы использовать его как параметр 'T' в универсальном типе или методе

Как я уже сказал, выполнение name.RequireThat("name").NotEmptyString(); работает нормально, так как name - это string. Я попытался указать тип для универсального, например, так:

userId.RequireThat<int>("userId").NotZeroOrLess();

Но я получаю ту же ошибку. Я должен признать, я не слишком хорошо разбираюсь в дженериках. Может кто-нибудь объяснить, почему эта ошибка происходит? Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Вы пытались удалить where T : class из вашего метода расширения public static ArgumentEx<T> NotZeroOrLess<T>(this ArgumentEx<T> arg) where T : class?

1 голос
/ 26 февраля 2012

Это выдает ошибку, потому что вы определили ограничение класса, но int это не класс, это тип значения - struct. Читать основы http://msdn.microsoft.com/en-us/library/d5x73970.aspx.

Чтение Почему я не могу использовать System.ValueType в качестве ограничения обобщений? для получения дополнительной информации.

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