簡體   English   中英

C#6.0,.NET 4.51和VS2015 - 為什么字符串插值有效?

[英]C# 6.0, .NET 4.51 and VS2015 - Why does string interpolation work?

閱讀以下內容后:

在我看來,除了String Interpolation之外,我在VS2015中針對.NET 4.51編譯的任何項目都可以使用新的C#語言功能。

但是我使用VS2015定位4.51在我的開發機器上嘗試了以下代碼:

string varOne = "aaa";

string varTwo = $"{varOne}";

if (varTwo == "aaa")
{

}

並且我不僅沒有收到編譯器錯誤,它的工作原理varTwo包含aaa,如預期的那樣。

有人可以解釋為什么會這樣,因為我不希望這個工作嗎? 我猜我錯過了FormattableString的真正含義。 有人能舉個例子嗎?

正如評論中所提到的,字符串插值在這種情況下起作用,因為所有新編譯器都在編譯時將表達式轉換為“等效的string.Format調用”。

來自https://msdn.microsoft.com/en-us/magazine/dn879355.aspx

在編譯時轉換字符串插值以調用等效的string.Format調用。 這就像之前一樣留下了對本地化的支持(盡管仍然使用傳統的格式字符串)並且不會通過字符串引入任何后編譯注入代碼。


FormattableString是一個新類,允許您在呈現之前檢查字符串插值,以便您可以檢查值並防止注入攻擊。

// this does not require .NET 4.6
DateTime now = DateTime.Now;
string s = $"Hour is {now.Hour}";
Console.WriteLine(s);

//Output: Hour is 13

// this requires >= .NET 4.6
FormattableString fs = $"Hour is {now.Hour}";
Console.WriteLine(fs.Format);
Console.WriteLine(fs.GetArgument(0));

//Output: Hour is {0}
//13

有人可以解釋為什么會這樣,因為我不希望這個工作嗎?

這是有效的,因為您正在使用VS2015附帶的新Roslyn編譯器進行編譯,並且知道如何解析字符串插值語法糖(它只是調用string.Format的正確重載)。 如果您嘗試利用.NET Framework 4.6類與字符串插值很好地工作,例如FormattableStringIFormattable ,則會遇到編譯時錯誤(除非您自己添加它們 。請參閱帖子的下半部分) 。

我猜我錯過了FormattableString的真正含義。

FormattableString是.NET 4.6中引入的一種新類型,它允許您將新的字符串插值功能與您選擇的自定義IFormatProvider一起使用。 由於這不能直接在插值字符串上完成,因此您可以利用FormattableString.ToString(IFormatProvider) ,它可以傳遞任何自定義格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM