Чтобы понять проблему, полезно сделать сравнение с массивами.
List
не является подклассом List
. Но Dog[]
является подклассом Animal[]
.
Массивы являются reifiable и ковариантными. Подтверждаемый означает, что их информация о типе полностью доступна во время выполнения. Поэтому массивы обеспечивают безопасность типа времени выполнения, но не безопасность типа компиляции.
// All compiles but throws ArrayStoreException at runtime at last line
Dog[] dogs = new Dog[10];
Animal[] animals = dogs; // compiles
animals[0] = new Cat(); // throws ArrayStoreException at runtime
Это наоборот для дженериков: дженерики стерты и инвариантны. Поэтому генераторы не могут обеспечить безопасность во время выполнения, но они обеспечивают безопасность типа компиляции. В приведенном ниже коде, если дженерики были ковариантными, можно сделать загрязнение кучи в строке 3.
List dogs = new ArrayList<>();
List animals = dogs; // compile-time error, otherwise heap pollution
animals.add(new Cat());
-
обозначает диапазон символов, так же, как вы используете A-Z
для описания любого символа между A и Z . В вашем регулярном выражении используется ñ-\s
, который движок пытается интерпретировать как любой символ между - и \ s - и затем замечает, что \s
не имеет здесь большого смысла, потому что \s
является только аббревиатурой для любого символа пробела.
Вот откуда исходит ошибка.
Чтобы избавиться от этого, вы всегда должны поместите -
в конец вашего символьного класса, если вы хотите включить буквенный символ -
:
@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\s-]+$"
Таким образом, движок знает, что \s-
это не диапазон символов, а два символа \s
и -
отдельно.
Другой способ - выйти из символа -
:
@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêç\-\s]+$"
Итак, теперь двигатель интерпретирует ñ\-\s
не как диапазон символов, а как любой из символов ñ
, -
или \s
. Лично, хотя я всегда стараюсь избегать ускорения как можно чаще, потому что IMHO он засоряется и бесполезно растягивает выражение в длину.
[RegularExpression (@ "^ [a-zA-Z \ s] + $", ErrorMessage = "Разрешены только буквенные символы и пробелы.")]
Это работает
Вам нужно избежать последнего символа -
- синтаксический анализ ñ-\s
, как диапазон a-z
:
@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\-\s]+$"