2010-12-10 3 views
16

次のコードは正常にコンパイル:デバッガで新しい文字列を使用できないのはなぜですか?

string foo = new string(new char[] { 'b', 'a', 'r' }); 

ウォッチウィンドウまたはイミディエイトウィンドウに貼り付ける場合は、次のコードが評価されるように失敗します。

new string(new char[] { 'b', 'a', 'r' }); 

エラーメッセージは次のとおりです。

'new string(new char[] { 'b', 'a', 'r' })' threw an exception of type 'System.ArgumentException' 
    base {System.SystemException}: {"Only NewString function evaluation can create a new string."} 
    Message: "Only NewString function evaluation can create a new string." 
    ParamName: null 

なぜこれが起こりますか?

+1

を参照してくださいに結果stringオブジェクトを転送することによってstringコンストラクタにこのブログの記事を呼び出しますVisual StudioでVB.Netで2010年に、この例外は表示されません注意してください](http://dotnetdust.blogspot.com/2009/03/string-construtor-stringchar-value.html)。 – cdhowie

+1

これはVS 2015で「固定」となっていますが、Roslynを使用しているため推測しています。 –

答えて

23

C#式評価ツールは、デバッグセッション中にCLRと対話するためにICorDebugEval & ICorDebugEval2インターフェイスを使用します。そのインタフェースは、string型のコンストラクタの呼び出しを許可しません。代わりに、ICorDebugEval::NewStringメソッドを実行するために、すべての呼び出しでstringの新しいインスタンスを作成するように強制します。 C#EEはEEの特殊ケースではないstringなので、コンストラクタを直接呼び出して失敗します。

は、あなたがそれは特別なケースは、[引数を評価し、ICorDebugEval::NewString

+0

なぜ 'NewString'メソッドがあるのですか? 'NewObject'を使って文字列を作成しないのはなぜですか? – Brian

+0

@ブライアン、私はなぜ彼らがその区別をしたとして歴史を知らないと私はしばらく前に現在のコードのメンテナも尋ねた。 – JaredPar

+3

回避策として、これを使用することができます: 新しいSystem.Text.StringBuilder()。Append(新しいchar [] {'b'、 'a'、 'r'}))ToString() –

関連する問題