2012-01-17 9 views
1
public class ImgBuffer<T> 
{ 
    public T[] buf; 
    public int width; 
    public int height; 
    public ImgBuffer() {} 
    public ImgBuffer (int w, int h) 
    { 
     buf = new T[w*h]; 
     width = w; 
     height = h; 
    } 

    public void Mirror() 
    { 
     ImageTools.Mirror (ref buf, width, height); 
    } 
} 

ImageToolsクラスには、fist引数のbyte []、short []、およびColor32 []にミラーが定義されています。特に:C#ジェネリック問題:無効な引数

public void Mirror(ref Color32[] buf, int width, int height) { .... 

しかし、私はこのエラーを取得する:

エラーCS1502: `ImageTools.Mirror(REF Color32 []、int型、int型)のための最良のオーバーロードされたメソッドの試合は」いくつかの無効な引数

を持っています

私は何が間違っていますか?

+0

ImageToolsに 'string []'のミラーオーバーロードがありますか?私は完全に 'ImgBuffer 'を作りたいからです。私はそれを 'ImgBuffer 'で追跡します。 –

+0

いいえ、そうではありません。 – Dave

+0

次に、文字列配列を持つミラーへの呼び出しが合法であることをコンパイラーがどのように知っていますか? –

答えて

4

C#のジェネリックがテンプレートのように見えるようです。そうではありません。あなたの説明から、コンパイラがImgBuffer.Mirrorでそれを確認することはできません

public class ImgBuffer<T> 
{ 
    public T[] buf; 
    public int width; 
    public int height; 

    public void Mirror() 
    { 
     ImageTools.Mirror(ref buf, width, height); 
    } 
} 

この

public class ImageTools 
{ 
    public static void Mirror(ref byte[] buf, int width, int height) { } 
    public static void Mirror(ref Color32[] buf, int width, int height) { } 
    public static void Mirror(ref short[] buf, int width, int height) { } 
} 

のようになりますそして、あなたはこの(省略)のように見えるImgBufferクラスを持っているImageToolsクラスがあります表示されますImageTools.Mirrorへの呼び出しは合法です。 ref bufについては、コンパイラはすべてT[]であることを知っています。 Tは何でもかまいません。 string、int、DateTime、Fooなどがあります。コンパイラは引数が正しいことを確認できないため、コードは不正です。

このは合法ですが、あなたの3つのタイプのMirrorメソッドの具体的な実装があると感じているので、おそらく実行できません。

public class ImageTools<T> 
{ 
    public static void Mirror(ref T[] buf, int width, int height) { } 
} 
+0

私は参照してください。はい、これはC#ジェネリックスへの私の最初の進出です、私は前にC + +のテンプレートの男でした。ありがとうございました。考えられるデータ型ごとにミラーを定義せずにこれを修正する方法はありますか?キャスティングまたは制約? – Dave

+1

ここでは制約は機能しません。制約を適用して、Tを構造体やクラス、インタフェースや与えられた基底クラス、パラメータのないコンストラクタを持つアイテムに限定することができます。 「Tをbyte、short、またはColor32にしたい」というように制限することはできません。 –

+0

私はImageToolsクラスを汎用的に再加工することができましたが、それはうまくいく必要があります(これらの操作のそれぞれは現在、特定のデータ型に最適化されています。 )4バイトの長さ)どのタイプが「来ている」とアルゴリズムを切り替えることができますか? – Dave

0

ジェネリック型の引数をスコープする必要があります。例:

public class ImgBuffer<T> where T : Color32 
{ 
    public T[] buf; 
    public int width; 
    public int height; 
    public ImgBuffer() {} 
    public ImgBuffer (int w, int h) 
    { 
     buf = new T[w*h]; 
     width = w; 
     height = h; 
    } 

    public void Mirror() 
    { 
     ImageTools.Mirror (ref buf, width, height); 
    } 
} 
+0

Anthony Pegramが正しく推論しているので、私はこれをいくつかのクラスで動作させるために必要とし、Color32、short、byteなどのリストは機能しません(コンパイラは常にリストの最後のクラスが最初に来なければならないと言う) – Dave