2015-09-24 6 views
8

これはコンパイル:変換する文字列が

string s = "my string"; 
unsafe 
{ 
    fixed (char* ptr = s) 
    {    
      // do some works 
    } 
} 

これにはない:

string s = "my string"; 
unsafe 
{ 
    fixed (char* ptr = (char*)s) 
    {    
      // do some works 
    } 
} 

エラーCS0030: 'のchar *'

に型 'string' を変換できません。

c# specの最初の構文を許可するが、2番目の構文を禁止する箇所は見つかりません。あなたはこのことについて話し合ったことを助けて指摘できますか? fixed声明 -

+0

これがなぜ落とされたのかわかりません - 私には良い質問のようです。何が期待されているか、エラーについてはっきりしていることなどを明確にしてください。 –

+0

Jonが仕様を見ている間に、[実装の側面](http://stackoverflow.com/a/32465407/3764814)を見せてください。要約すると、 'string'オブジェクトへのポインタに関するCLIの* kind *型があり、その代わりに最初のcharへのポインタが与えられます(配列の場合も同様です)。 –

+2

@LucasTrzesniewski BCLのバージョンが異なり、Monoも違う 'string.GetHashCode()'の実装を研究しながら、この質問に遭遇しました。 *いくつかの実装では、非ゼロの 'RuntimeHelpers.OffsetToStringData'が処理の前にポインタ値に追加されます。これは、最初の文字を指しているかどうかがバージョンによって異なることを意味する可能性があります。 –

答えて

7

それは仕様のセクション18.6にあります。

関連作品は、次のとおり

固定ステートメント)組み込みステートメント

固定
    fixed (ポインタ型固定ポインタ宣言子-pointer-declarator
    識別子=固定ポインタ初期

固定ポインタ初期
    &可変基準
    発現

あなたは表現バージョンを使用しようとしています。

の発現:stringからchar *の表現として、通常の「変換*がないながら今、スペックは固定ポインタ初期化子ができることを言って、stringケースを呼び出しタイプstring、タイプchar*を提供するが、この場合、初期化子は、文字列の最初の文字のアドレスを計算します。固定文で与えられたポインタ型に暗黙的に変換され、文字列全体のための固定アドレスにとどまることが保証されます固定されたステートメントの期間は、文字列式がnullの場合、実装定義です。

だからはあなたのようなだけで、あなたは本当に固定にどのような表現の特殊なケースを利用している通常の変数宣言を実行し、stringからchar *への暗黙的な変換を使用しているに見えますが、 -pointer-initializerは許可されます。