Это - очень хороший вопрос. По моему опыту, с атрибутами, я думаю, что ограничение существует потому что, когда размышляющий над атрибутом оно создало бы условие, в котором необходимо будет проверить на все возможные перестановки типа: typeof(Validates<string>)
, typeof(Validates<SomeCustomType>)
, и т.д.
, По-моему, если пользовательская проверка требуется в зависимости от типа, атрибут не может быть лучшим подходом.
, Возможно, класс проверки, который берет в SomeCustomValidationDelegate
или ISomeCustomValidator
в качестве параметра, был бы лучшим подходом.
Хорошо, после того, как мой коллега упомянул мне, что он столкнулся с этим секретным заклинанием в книге Программирование на Scala , я поискал в своей копии и нашел его описание в Раздел 8.8 Повторяющиеся параметры . (Хотя вам нужно искать с пробелом между двоеточием и подчеркиванием: - /) Есть одно предложение, объясняющее это как:
... добавьте аргумент массива с двоеточием и
_ *
символ, например:scala> echo (arr: _ *)
Эта запись указывает компилятору передавать каждый элемент
arr
в качестве собственного аргумента вecho
, а не все его как единственный аргумент.
Я считаю, что описание , предлагаемое здесь , более полезно.
Итак, x: _ *
- это как объявление типа, которое сообщает компилятору обрабатывать x
как повторяющийся параметр (также известный как список аргументов переменной длины - vararg ).