2011-10-18 29 views
3

私はクラスを持っている:なぜ私は拡張メソッドを呼び出せませんか?

class Program 
{ 
    static void Main(string[] args) 
    { 

    } 

    public static int SetFlag_Old(this int i, int flag, bool set = true) 
    { 
     return (set) ? i | flag : ((i & flag) != 0) ? (i - flag) : i; 

    } 
} 

そして私は、私は延長mthodを呼び出すと、私はその理由を理解カントオプションを得ることはありません上記のmainメソッドにこのコードを入れて...

int i = 0; 
i. 

私が非静的メソッドを作成してそのコードを置いても、拡張メソッドを呼び出すようです。本当にシンプルなものが欠けていますか?

+1

これはコンパイルされません。コンパイルエラーを修正しても問題は解決します –

+3

"エラーCS1106:拡張メソッドは非ジェネリックな静的クラスで定義する必要があります" - コンパイラが何かを教えようとしているように感じます。 –

+0

こんにちは@Marc、皮肉な応答のおかげで。実際には、私はdidntは、私はいつものエラータブを取得didntビルドを構築することを認識しています。私はビジュアルスタジオ(新しいマシン)を開いた。私はエラーリストを持っていなかったので、私は白い筆記に黒を見た。それは「OK」と見えた。私は本当に笑って周りを回っていたが、私は応答を感謝します。 – Exitos

答えて

14

拡張メソッドは静的クラスでなければならない:

public static class IntExtensions 
{ 
    public static int SetFlag_Old(this int i, int flag, bool set = true) 
    { 
     return (set) ? i | flag : ((i & flag) != 0) ? (i - flag) : i; 
    } 
} 

http://msdn.microsoft.com/en-us/library/bb383977.aspx

+0

すべての問題を修正しても、Intellisenseに表示されないことがあります。あなたのメソッド名全体を盲目的に入力するだけで、オープニングブラケットに入った後にintellisenseがパラメータを表示します。 – Oliver

+0

実際には、自分のクラスに入れる必要はありません。単純に、それは 'static'クラスでなければなりません。 'Program'を' static'とマークすると、同じことが実現します –

+0

@MarcGravell Trueですが、自分のクラスでそれを持つ方が良いと思います。私は私の答えを更新しました。 –

0

コードもコンパイルされません。エラーExtension method must be defined in a non-generic static classが返されます。どのくらいの情報が必要ですか?私はあなたのためにそれを再記述します:

拡張方法は、非ジェネリック静的クラス

私はあなたがあなたのProgramクラスstaticを作ることができることを追加しますで定義する必要があります。その "エントリ"メソッド(Main)がstaticであることを考慮すると、なぜ彼らがコードテンプレートで直接静的にしていないのかわかりません。

0

拡張メソッドが配置されているクラスは静的なものでなければなりません。静的修飾子をProgramクラスに追加します。

関連する問題