2015-10-21 24 views
5

閱讀以下後:C#6.0,.NET 4.51和VS2015 - 爲什麼字符串插值工作?

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

不過,我想我的dev的機器下面的代碼使用VS2015目標4.51:

string varOne = "aaa"; 

string varTwo = $"{varOne}"; 

if (varTwo == "aaa") 
{ 

} 

和我不僅沒有收到一個編譯器錯誤,它曾作爲varTwo包含AAA預期。

有人可以解釋爲什麼這是這種情況,因爲我不希望這個工作?我猜我缺少什麼FormattableString的真正含義。有人能給我一個例子嗎?

+2

也許它足夠聰明將字符串轉換爲String.Format調用? – BradleyDotNET

+1

'FormattableString'在.NET 4.5中引入。 – MarcinJuraszek

+0

@MarcinJuraszek那麼你是說i3arnon對Rubenisme的評論在「Does C#6.0 ....」中是錯誤的嗎? – TheEdge

回答

11

正如註釋中所提到的,字符串插值在這種情況下起作用,因爲所有新編譯器都會在編譯時將表達式轉換爲「等效的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 
+0

不知道這個答案與[另一個](http://stackoverflow.com/a/33249478/477420)不同/更好(或者它如何解決尚未確定的OP問題)。 –

+0

添加了FormattableString類和示例的解釋。 – codersl

+0

@codersl語法錯誤now.hour - > DateTime.Now.Hour – TheEdge

7

有人可以解釋爲什麼這是這種情況,因爲我不希望這個工作?

這工作,因爲你有新的羅斯林編譯器編譯附帶的VS2015,並且知道如何解析字符串插補語法糖(它只是調用的string.Format適當的過載)。如果您嘗試利用可與字符串插值很好地配合使用的.NET Framework 4.6類(例如FormattableStringIFormattable),則會遇到編譯時錯誤(除非您爲add them yourself,請參閱帖子底部)。

我猜我缺少什麼FormattableString的真正含義。

FormattableString是一種新型介紹了.NET 4.6,它允許您使用新的字符串插補功能,與您所選擇的自定義IFormatProvider。由於這不能直接在插入的字符串上完成,因此可以利用FormattableString.ToString(IFormatProvider)這可以通過任何自定義格式。

+0

@downvoter所以啓發了一個downvote的理由。 –

+0

這不是我,但['FormattableString'](https://msdn.microsoft.com/en-us/library/system.formattablestring(v = vs.110).aspx)在.Net 4.5中 – DavidG

+2

@ DavidG不根據文檔:* .NET Framework **可用自4.6 *** –

相關問題