none
コンパイルエラーについて RRS feed

  • 質問

  • はじめまして、ASP.NETの学習をはじめたnoriyasuと申します。

    ASP.NET4.0 でC#で学習中です。

    この度、ある入門書を購入し、それを参考に学習を進めているのですが、

    コンパイルエラーが発生して実行できなくて、困っています。

    内容は

    コンパイル エラー メッセージ: CS1061: 'object' に 'Replace' の定義が含まれておらず、型 'object'
    の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

    エラーコード:<asp:Label ID="BodyLabel" runat="server" Text='<%# Eval("Body").Replace(vbLf, "<br />") %>' />

    です。

    学習をはじめたばかりなので、解決法が分かりません。どなたか、良い解決方法を御伝授ください。

    よろしくお願い致します。

    2012年6月7日 22:56

回答

  • C# の基本的な文法として、明示的な型変換(キャスト)が必要
    なケースがあることを理解されているでしょうか? 今回の場合、
    object 型から string 型へのキャストが必要です。

    Eval メソッドの正体は何かというと、DataBinder.Eval 静的メ
    ソッドです。例えば、

    Text='<%# Eval("Body") %>'

    とすると、DataBinder.Eval を以下のように呼び出します。

    Text='<%# DataBinder.Eval(Container.DataItem, "Body") %>'

    DataBinder.Eval は object 型を返しますが、object 型には
    Replace というメソッドは含まれないので、今回のエラーが出た
    というわけです。

    以下のように string 型にキャストしてから Replace メソッドを
    適用します。なお、vbLf は Visual Basic 用ですので、C# の場
    合は "\n" としてください。

    Text='<%# ((string)Eval("Body")).Replace("\n", "<br />") %>'>

    不特定多数のユーザー入力を表示するような場合は、セキュリティ
    対策として、ブラウザに表示する前に HtmlEncode することをお勧
    めします。以下のような感じです。

    Text='<%# Server.HtmlEncode((string)Eval("Body")).Replace("\n", "<br />") %>'>

    • 回答としてマーク noriyasu 2012年6月8日 13:47
    2012年6月8日 13:17

すべての返信

  • 質問ですが、使用されている言語はC#とVisual Basicのどちらでしょうか? 質問文には「C#で」と書かれていますしコンパイルエラーもC#のものです。しかし、挙げられているコードには「vbLf」が含まれていてVBのようにも思われます。
    書籍にそのように書かれているのだとしたら、誤りであり著者/出版社に確認してみるのも手です。
    2012年6月8日 0:21
  • エラーメッセージを見るとEval("Body")はobject型になるようですので、一度string型にしてからReplaceメソッドを実行すれば良いと思います。

    Eval("Body").ToString().Replace(vbLf, "<br />")


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年6月8日 0:22
    モデレータ
  • C# の基本的な文法として、明示的な型変換(キャスト)が必要
    なケースがあることを理解されているでしょうか? 今回の場合、
    object 型から string 型へのキャストが必要です。

    Eval メソッドの正体は何かというと、DataBinder.Eval 静的メ
    ソッドです。例えば、

    Text='<%# Eval("Body") %>'

    とすると、DataBinder.Eval を以下のように呼び出します。

    Text='<%# DataBinder.Eval(Container.DataItem, "Body") %>'

    DataBinder.Eval は object 型を返しますが、object 型には
    Replace というメソッドは含まれないので、今回のエラーが出た
    というわけです。

    以下のように string 型にキャストしてから Replace メソッドを
    適用します。なお、vbLf は Visual Basic 用ですので、C# の場
    合は "\n" としてください。

    Text='<%# ((string)Eval("Body")).Replace("\n", "<br />") %>'>

    不特定多数のユーザー入力を表示するような場合は、セキュリティ
    対策として、ブラウザに表示する前に HtmlEncode することをお勧
    めします。以下のような感じです。

    Text='<%# Server.HtmlEncode((string)Eval("Body")).Replace("\n", "<br />") %>'>

    • 回答としてマーク noriyasu 2012年6月8日 13:47
    2012年6月8日 13:17
  • ご意見ありがとうございます。

    佐祐理様の御指摘通り「vbLf」はVBですね。

    今回、間違ってVBの入門書を買ってしまいまして、VBコードをC#にして学習しています。

    「vbLf」を「\n」として対応しました。これもエラーの原因ですが、CS1061は、string 型へのキャストなしのエラーでした。

    大変助かりました。今後とも、よろしくお願いします。

    2012年6月8日 13:36
  • ご意見ありがとうございます。

    trapemiya様の御指摘通り、CS1061はstring 型へのキャストなしが原因でした。

    大変、助かりました。

    ちなみに、C#を使っているのに「vbLf」と書いていたところでもエラーが発生してました。

    今後とも、よろしくお願い致します。

    2012年6月8日 13:42
  • ご意見ありがとうございます。

    SurferOnWww様の御指摘通り、2つのエラーがあり、修整しました。

    詳しい御説明と、セキュリティー対策まで御伝授頂き、感謝いたします。

    大変助かりました。今後とも宜しくお願いいたします。

    2012年6月8日 13:47