2007年03月15日

C#のジェネリックメソッドの型推論

   このエントリーをはてなブックマークに追加 Clip to Evernote

 public T Foo<T>(int n) where T: new() {
T x = new T();
...
return x;
}

みたいなメソッドをC#で書いたら、FxCopで、

警告 1 CA1004 : Microsoft.Design : MyClass.Foo(Int32):T が、それへの呼び出し内で、明示的な型パラメータを必要としないデザインを考慮してください。

という警告が出た。ヘルプを読むと、引数にも T を入れろということらしい。

これは、どういうことかというと、
 public void Moge(T x, int n) {
...

}

というように、引数にも T がある場合、呼び出す際に、

obj.Moge<Sample>(sample, 5);


のように書く必要はなく、コンパイラが型推論を行ってくれるので、

obj.Moge(sample, 5);


のように、型パラメータを省略することができるということ。

でも、今回の僕のコードは、そもそも、引数には、T のインスタンスは不要なんだから、引数に T を入れるのは、ナンセンス。
ただ、この書き方は、推奨されないんだから、どうしようかなと考えたが、何のことはない、

 class MyClass<T> where T : new() {
..
public T Foo(int n) where T: new() {
T x = new T();
...
return x;
}
}


と、ジェネリッククラスにすれば良いだけだった。orz
このクラスには、ほかにもジェネリックメソッドがあったので、はじめから、ジェネリッククラスにすべきものだった。
FxCopは、設計上の見落としにも気が付くので、とても重宝している。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50730144
この記事へのトラックバック
C#のジェネリックメソッドの型推論 こちらで拝見したFxCopというツールを、さっそくダウンロード。 動かしてみると、どこかで見覚えが…… 以前、JavaのFindBugsというツールを知ったときに、C#にも同じようなツールがないかと探したときに見つけたツールだった。 ...
C# FxCopの使い方【プログラミング日記】at 2007年03月16日 22:39