5

我可以用来为动态对象创建属性的字符类型是否有任何限制?

是否有我不能使用的字符列表(例如 / * @)?

4

2 回答 2

6

假设你有:

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 */)。

似乎对使用的名称没有限制。字符串键似乎序数字符串比较进行比较,例如 inEqualityComparer<string>.DefaultStringComparer.Ordinal

当然,与 C# 规则相比,某些 .NET 语言对名称中的有效字符有不同的规则。

于 2013-05-08T16:56:02.907 回答
3

正如C# 规范所说,任何 Unicode 标准附件 15 字符(和下划线) :

本节中给出的标识符规则与 Unicode 标准附件 15 推荐的规则完全一致,除了下划线允许作为初始字符(在 C 编程语言中是传统的),标识符中允许使用 Unicode 转义序列,以及允许使用“@”字符作为前缀,以使关键字可以用作标识符。

有关需要前缀的字符列表@,请查看此处

于 2013-05-08T15:47:07.830 回答