11

古いスタイルのASPコードに似たテンプレートシステムがあります。これを、全体をC#ソースコードに書き換え、コンパイルし、最後に実行するクラスで実行します。

私が疑問に思っているのは、生成されたC#コードにコンパイルエラーをテンプレートファイルの行番号と一致させるような#pragmaのようなディレクティブがあるかどうかです。

たとえば、テンプレートコードに次の最初で唯一の行があるとします。

Object o = datta; // should be data, compiler error

しかし、これをコンパイルするには、名前空間、クラス、メソッド、およびボイラープレートコードを追加する必要があるため、テンプレートファイルの1行目である上記の行は、実際には17行目になります。 (ランダムな数字、説明のためだけに)C#コード。コンパイラエラーは、当然、エラーが1行目ではなく17行目にあることを示すフラグを立てます。

以前に使用した別のプログラミング言語から(どれを思い出せないのですが)、追加できるディレクティブがあり、エラー行番号が並ぶことを覚えています。

C#3.5にそのようなものはありますか?

4

1 に答える 1

18

#lineプリプロセッサディレクティブがあります。

#lineコンパイラの行番号と(オプションで)エラーと警告のために出力されるファイル名を変更できます。

#line directive、ビルドプロセスの自動化された中間ステップで使用される場合があります。たとえば、元のソースコードファイルから行が削除されたが、ファイル内の元の行番号に基づいてコンパイラが出力を生成するようにしたい場合は、行を削除してから、を使用して元の行番号をシミュレートできます#line

#line hiddenディレクティブは、デバッガーから連続する行を非表示にします。これにより、開発者がコードをステップ実行するときに、aと次のディレクティブの間の行(#line hidden#lineの#line非表示ディレクティブではない場合)がステップオーバーされます。このオプションを使用して、ASP.NETでユーザー定義のコードとマシンで生成されたコードを区別することもできます。ASP.NETはこの機能の主要な利用者ですが、より多くのソースジェネレーターがこの機能を利用する可能性があります。

ディレクティブは、エラー報告の#line hiddenファイル名や行番号には影響しません。つまり、非表示のブロックでエラーが発生した場合、コンパイラはエラーの現在のファイル名と行番号を報告します。

ディレクティブは#line filename、コンパイラ出力に表示するファイル名を指定します。デフォルトでは、ソースコードファイルの実際の名前が使用されます。ファイル名は二重引用符( "")で囲む必要があり、行番号を前に付ける必要があります。

于 2009-08-31T17:39:28.653 に答える