2015-07-10 83 views
48

我一直在使用字符串插值和爱它,但是我有一个问题,我试图在我的输出中包含一个反斜杠,但我无法让它工作。如何在C#6中使用带字符串插值的转义字符?

我想是这样的..

var domain = "mydomain"; 
var userName = "myUserName"; 
var combo = $"{domain}\{userName}" 

我要组合的输出为

myDomain\myUserName 

我所得到的是关于\是转义字符语法错误。如果我放入\\然后snytax错误消失了,但输出是myDomain \\ myUsername

如何在转换后的字符串中包含转义字符?

+0

谢谢。但后来我不能使用字符串插值?我不想逃避一切。我只想在内插字符串中使用反斜杠。 – Matt

+0

不,你不能。他的回答是错误的。 – greenhoorn

+1

对我来说就像是一个bug;)\\应该工作 – Matt

回答

2
$"{domain}\\{user}" 

工作正常 - 转义工作照常(除非转义{)。至少在.NET 4.6和VS 14.0.22823 D14REL上。

如果没有出于某种原因,你也可以尝试更加明确的(也许你正在使用的编译器的旧版本?):

$"{domain}{@"\"}{user}" 
+0

这就是我的想法。有趣的是,在我的表面pro 3中,代码可以正常运行\\或显式@“\”,但是在我的工作机器上,它没有。所以我认为你可能已经对安装的版本感到头疼了。不幸的是,我的工作机器说没有更新可用。所以,我的问题是如何在我的机器上确定.net 4.6的确切版本/内部版本?在这方面,事情似乎有所改变,我无法找到关于构建/版本号的许多指导。 – Matt

+0

从我可以告诉我在两台机器上运行相同版本的.net和vs 2015 RC。唯一的区别是我能想到的是,按预期工作的计算机(SP3)正在运行最新的Windows 10内部预览。我相信.net框架附带了这个,所以也许我有一个更新的版本。我只是不知道如何特别检查。 – Matt

+0

**更新**在c:\ windows \ microsoft.net \ framework64 \ v4.0.30319文件夹中查看clr.dll的属性详细信息我可以看到区别。我表面上的版本是4.6.79.0,我的工作机器上的版本是4.6.57.0。所以我现在的问题是,我如何从4.6.57.0升级到4.6.79.0? (为什么这很难!) – Matt

41

你可以做到这一点,同时使用$ @。顺序很重要。

var combo = [email protected]"{domain}\{userName}"; 
46

使用反斜杠(\)进行转义适用于除大括号外的所有字符。

如果你试图逃避一个大括号({}),您必须使用{{}}https://msdn.microsoft.com/en-us/library/dn961160.aspx

...所有出现的双花括号(“{{”和“}}”)被转换为一个花括号。

+0

正如OP明确解释的那样,它不适用于反斜杠本身。 – ProfK

0

如果我没有误解。解决方案非常简单

var domain = "mydomain"; 
var userName = "myUserName"; 
var combo = $"{{{domain}}}\\{{{userName}}}"; 
Console.WriteLine(combo); 

我同意birdamongmen的答案以及在那里提供的很好的参考。希望对你有帮助。我的5美分

+1

你的确误解了。 OP并非试图摆脱花括号。他们明确表示他们试图逃避反斜杠本身,而普通的'\\\'不能用插入的字符串工作。 – ProfK

-1

爱德华多是正确的。你通过加倍来避免花括号。因此,如果你想输出域变量{MYDOMAIN}您需要做的:

$"{{{domain}}}"; 

此外,假设当前日期是2016年9月1日,这样做:

$"The date is {DateTime.Now}"; 

会输出类似于“日期为2016/09/01 3:04:48 PM”,取决于您的本地化。您还可以通过执行格式化日期:

$"The date is {DateTime.Now : MMMM dd, yyyy}"; 

将输出“日期为2016年9月1日”。插值字符串更具可读性。好的回答爱德华多。

+1

OP并不试图摆脱大括号。他们明确表示他们试图逃避反斜杠本身,而普通的'\\''在插入字符串中不起作用。 – ProfK

0

喜为逃避插值字符串反斜杠规则是重复的反斜杠:

var domain = "mydomain"; 
var userName = "myUserName"; 
var combo = $"{domain}\\{userName}"; 

console output

,但如果你同时使用插值的字符串作为逐字字符串,那么你就不需要逃跑反斜杠:

var domain = "mydomain"; 
var userName = "myUserName"; 
var combo = [email protected]"{domain}\{userName}"; 

,你会得到相同的:

console output

对于有关插值字符串教程:see video interpolated string

相关问题