$ STR='new
line'
$ printf '%s' "$STR"
new
line
Да, это означает запись Enter, где это необходимо в коде. new line
. \n ### A common way to represent a new line character.
\012 ### Octal value of a new line character.
\x0A ### Hexadecimal value of a new line character.
Но все они требуют «интерпретации» каким-либо инструментом ( POSIX printf ): echo -e "new\nline" ### on POSIX echo, `-e` is not required.
printf 'new\nline' ### Understood by POSIX printf.
printf 'new\012line' ### Valid in POSIX printf.
printf 'new\x0Aline'
printf '%b' 'new\0012line' ### Valid in POSIX printf.
И поэтому инструмент должен построить строку с новой строкой: $ STR="$(printf 'new\nline')"
$ printf '%s' "$STR"
new
line
$ STR=$'new\nline'
$ echo '6e65770a6c696e650a' | xxd -p -r
new
line
Или $ echo "new line" | sed 's/ \+/\n/g'
new
line
Это - ограничение CLR. Только примитивные константы или массивы примитивов могут использоваться в качестве параметров атрибута. Причина, почему это - атрибут, должна быть закодирована полностью в метаданных. Это отличается, чем тело метода, которое кодируется в IL. Используя MetaData только сильно ограничивает объем значений, которые могут использоваться. В текущей версии CLR значения метаданных ограничены примитивами, пустым указателем, типы и массивы примитивов (возможно, пропустил незначительный).
Десятичные числа, в то время как основной тип не тип примитива и следовательно не может быть представлен в метаданных, которые препятствуют тому, чтобы он был параметром атрибута.
Для приемов в реальном времени с атрибутами я использую класс TypeConverter .
Когда я столкнулся с этой ситуацией, я закончил тем, что выставил свойства атрибута как Double, но внутри атрибута обработал их как Decimal. Далеко не идеально, но для простых случаев это может быть то, что вам нужно.
Вы можете использовать следующий конструктор. Когда у вас есть десятичный литерал в коде C #, компилятор C # посылает вызов этому конструктору.
Decimal (Int32, Int32, Int32, Boolean, Byte)
Изменить: я знаю, что это неудобно.
У меня та же проблема. Я рассматриваю возможность использовать строк . Это не типобезопасно, но читается, и я думаю, что мы сможем записывать действительные числа в строки :-).
class BlahAttribute : Attribute
{
private decimal value;
BlahAttribute(string number)
{
value = decimal.Parse(number, CultureInfo.InvariantCulture);
}
}
[Blah("10.23")]
class Foo {}
Это не красиво, но после рассмотрения всех вариантов вполне достаточно.