5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

文字列補間($)の挙動

Last updated at Posted at 2021-05-18

概要

文字列補間で文字列結合を行おうとした

環境

・Windows10
・framework 4.5.2

コード

Program.cs
static void Main(string[] args)
{
    var s1 = @"{str";
    var s2 = @"ss}";

    var s = string.Format($"{s1}:{s2}");

    Console.WriteLine(s);
}

実行結果

単純に2つの文字列を:で結合して{str:ss}の結果を得ようとした。

が、

ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。

の例外が。。

どうも{が入っていると再評価されるようで展開に失敗していた模様。

改善

引数を指定する形に変更

Program.cs
static void Main(string[] args)
{
    var s1 = @"{str";
    var s2 = @"ss}";

    var s = string.Format("{0}:{1}", s1, s2);

    Console.WriteLine(s);
}

無事結合した結果{str:ss}が取得できました。

再評価されるとは知らなんだ。。
@lensouko さんのコメントより、内部の{s1}:{s2}が先に展開されてその後string.Format("{str:ss}");になるってことで理解できました。

展開された文字列に対しstring.Formatできるか

先に展開されるのなら、展開された文字列に対してstring.Formatできるか試してみました。

Program.cs
static void Main(string[] args)
{
    var s1 = @"{str";
    var s2 = @"ss}";
#pragma warning disable CS0219 // 変数は割り当てられていますが、その値は使用されていません
    var strss = @"I an strss!";
#pragma warning restore CS0219 // 変数は割り当てられていますが、その値は使用されていません

    var s = string.Format($"{s1}{s2}");

    Console.WriteLine(s);
}

そんなにうまい話はなかった。

ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。
5
3
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?