逐語的な文字列を保存する場合、
string s=@""Hello"";
仮想的に文字列を解析して出力する必要があります"Hello"
(文字を"
文字列の一部として取得します)。
しかし、実際には失敗し、代わりstring s=@"""Hello""";
に目的の出力が表示されます ( "Hello"
)。
構文で余分な"
文字が必要なのはなぜですか? C# が前述の仮想的な方法で機能し始めた場合、破壊的な結果はどのようなものになるでしょうか?
逐語的な文字列を保存する場合、
string s=@""Hello"";
仮想的に文字列を解析して出力する必要があります"Hello"
(文字を"
文字列の一部として取得します)。
しかし、実際には失敗し、代わりstring s=@"""Hello""";
に目的の出力が表示されます ( "Hello"
)。
構文で余分な"
文字が必要なのはなぜですか? C# が前述の仮想的な方法で機能し始めた場合、破壊的な結果はどのようなものになるでしょうか?
技術的には、string s=@""Hello""; 「こんにちは」と出力する必要があります
いいえ、それは無効です。コンパイラは、言語仕様の規則に従う必要があり、従う必要があります。
逐語的な文字列リテラル内では、「文字列の末尾」を意味するだけの二重引用符と区別するために、二重引用符を 2 つ (3 つではなく)二重にする必要があります。
文字列の先頭や末尾ではなく、途中で二重引用符を使用すると、これを確認するのが最も簡単です。
string x = @"start "" end";
F# は上記のケースで完全に機能します
私が見る限りではありません。VS2015 Preview のサンプル F# プロジェクト:
let x = @""Hello""
... はエラーを返し@"""Hello"""
ますが、文字列は"Hello"
.
さらに、F# verbatim 文字列リテラルのドキュメントでは、C# とまったく同じように動作することが示唆されています。
@ 記号が前に付いている場合、リテラルはそのままの文字列です。これは、2 つの引用符文字が 1 つの引用符文字として解釈されることを除いて、エスケープ シーケンスが無視されることを意味します。
基本的に、逐語的な文字列リテラルは C# と F# の両方で完全に機能するように思えますが、どちらも二重引用符を二重にする必要があります。F# にも 3 重引用符で囲まれた文字列があり、その中で 2 重にする必要はありません... しかし、それは C# にはない別の機能です。
編集:あいまいさについてのコメントに答えるために、あなたはの例を挙げました@"1"2""
。それを少し変えてみましょう:
string x = @"1"+"";
現時点での C# では、これはコンテンツを含む逐語的な文字列リテラルと1
空の通常の文字列リテラルを連結することを意味します。実際には content を持つ単一の逐語的な文字列リテラルであるべきだと提案している場合1"+"
、パーサーは次のセミコロンが逐語的な文字列リテラルの末尾である直前の引用符に依存していますが、それは本当に悪い考えです。たとえば、次のように、2 つの引数のメソッド呼び出しの最初の引数として逐語的な文字列リテラルを使用したいとします。
Console.WriteLine(@"Foo {0}", "Bar");
あなたのルールでは、それは引数が 1 つの呼び出しになります。実行しようとしている呼び出しを 1 つのステートメントとして表現することは不可能です。(混乱を避けるために、逐語的な文字列リテラルに変数を使用する必要があります。)
要するに、私は C# が既に機能している方法に満足しています。
これは、開始文字と終了文字も必要なためです。したがって、次のような行を使用します。
s=@"""Hello""";
最初と最後の引用符文字は、文字列の開始と終了をコンパイラに示すためのものです。そして、文字列内の二重引用符シーケンス ("") は、文字列に引用符を付けたいことを示します。