Предположим, у вас есть:
dynamic eo = new ExpandoObject();
то, очевидно, если вы расширяете объект через C# синтаксис, вы должны следовать правилам C#, например:
eo.ValidCSharpIdentifier = 42;
eo._OK = 42;
eo.æ = 42;
Но если расширить eo
по литье до IDictionary<,>
, тогда вы можете использовать другие символы:
((IDictionary<string, object>)eo).Add("NotValidC#Identifier", 42);
((IDictionary<string, object>)eo).Add("42", 42);
((IDictionary<string, object>)eo).Add("/", 42);
((IDictionary<string, object>)eo).Add("*", 42);
((IDictionary<string, object>)eo).Add("@", 42);
((IDictionary<string, object>)eo).Add("", 42);
Как видим, возможны странные идентификаторы. Строка должна быть объектом, поэтому ссылка null
не может использоваться (как в .Add(null, 42) /* illegal */
).
кажется не нужно ограничивать использование имени. Строковые клавиши показаны для сравнения с порядковым номером сравнение строк, например, EqualityComparer<string>.Default
или StringComparer.Ordinal
.
Конечно, некоторые языки .NET имеют разные правила для действительных символов в именах по сравнению с правилами C#.
Почему бы вам просто не попробовать использовать эти символы, чтобы убедиться в этом? Если вы действительно хотите получить окончательный ответ, вы всегда можете прочитать спецификации C#, чтобы узнать, что такое юридический идентификатор. – Servy