2016-09-19 8 views
0

をスローのStringBuilder AppendFormatは、私は、テンプレートが文字列で定義されていIndexOutOfRangeException

builder.AppendFormat(Templates.EntityClassBegginingTemplate, entityName, baseClass); 

例外をスローラインそれ:

IndexOutOfRangeException:配列インデックスが範囲外です。 (System.String.FormatHelperの結果、IFormatProviderプロバイダ、System.String形式、System.Object []引数)(/ Users/builduser/buildslave/mono/build/mcs/class/corlib/System/System.String.cs:1912) System.Text.StringBuilder.AppendFormat(IFormatProviderプロバイダ、System.String形式、System.Object [] args)(/ Users/builduser/buildslave/mono/build/mcs/class/corlib/System (/ System/Object/builduser/buildslave/mono/build/mcs/class/System.Object arg1)System.StringBuilder.cs:533) corlib/System.Text/StringBuilder.cs:555)

私は間違いをしましたか?

+3

「Beginning」のスペルが間違っています。 –

+2

@を使うなら、{と}}の{と}にエスケープ文字を使わなければなりません。シングル{フィールドの数値があることを意味します。 –

答えて

3

クラステンプレートの開始中括弧がプレースホルダとして解釈されていると仮定します。リテラル文字として扱いたい中括弧をエスケープする必要があります。

public static string EntityClassBegginingTemplate = 
    @"using System.Collections.Generic; 

    //generated by the RuleDesigner 
    public abstract class {0}Base : {1} 
    {"; <-- this is where the issue likely originated 

エド・プランケットノートとして、あなたはダブルブレース表記、{{を使用して括弧をエスケープ、as covered in the MSDN

開閉括弧は 書式項目を開始と終了と解釈されています。そのため、エスケープシーケンスを使用して、 リテラルのオープニングブレースまたは閉じるブレースを表示する必要があります。 1つの開閉括弧( "{")、または2つの 閉じ括弧( "}}")を表示するには、固定テキストに2つの開閉括弧 ( "{{")を指定します。 形式の中括弧は、 の順に解釈されます。ネストされた中カッコの解釈はサポートされていません。

+1

私はIndexOutOfRangeExceptionではなくSystem.FormatExceptionを取得します。私は、例外がどこかに投げられるのだろうかと思います。とにかく私は彼女に "{{"エスケープすることについて話したいと思います。 –

+2

@EdPlunkett:スタックトレースを考えると、MS実装とMonoの違いかもしれないと思う。 –

+0

@JonSkeet良い点、ありがとう - 私はそれがモノであることに気付かなかった。 –

関連する問題