在Visual Studio 2013中,我封装了一个以 i
字母开头的字段。它会生成一个包含起始字母 I
int inside = 0;
public int Inside
{
get { return inside; }
set { inside = value; }
}
但是在Visual Studio 2015中,如果我封装了相同的字段,它会生成一个以 İ
字母开头的属性。应用一些缩进规则并在get和set修饰符之间添加空格
int inside = 0;
public int İnside
{
get
{
return inside;
}
set
{
inside = value;
}
}
如何更改此行为?我使用土耳其语键盘,如果它是相关的,系统文化是土耳其语
答案 0 :(得分:1)
您错误地键入了土耳其语i,而不是英语i。
这似乎是对重构代码的调试,在将第一个字母转换为大写时,它无法以安全的方式处理用户的文化。
土耳其语i
是most common examples之一,用于展示不同文化之间的差异,因为I
是`ý的大写字母。请查看MSDN中的Writing Culture-Safe Managed Code文章。
当您要输入拉丁变量名称时,请确保已将键盘切换为英语。 击>
正如OP评论的那样,结果不受键盘语言的影响,而是用户的语言环境。这意味着负责封装字段的Roslyn重构使用当前CultureInfo而不是不变量来执行ToUpper
调用。
Roslyn重构作为开源提供,因此很容易找到相关代码。在AbstractEncapsulateFieldService.cs中,GeneratePropertyName
方法调用char.ToUpper
而未指定文化:
return char.ToUpper(baseName[0]).ToString() + baseName.Substring(1);
将其更改为:
应该很容易return char.ToUpper(baseName[0],CultureInfo.InvariantCulture).ToString()
+ baseName.Substring(1);
<强>更新强>
我在Roslyn网站上opened an issue。
更新2
不幸的是,该问题已被关闭为“按设计”。看来,关闭它的人会混淆用户的语言环境设置与编写文本时使用的语言