2

このメソッドを含むプロジェクトをコンパイルしようとしています。

public void Send<T>(object o) where T : struct {
    BinaryWriter bw = new BinaryWriter(stream);
    bw.Write((T)o);
}

私はこの方法からインスピレーションを得ました(作業中)。

public static T Cast<T>(object o) {
    return (T)o;
}

BinaryWriter.Write関数はパラメーターのプリミティブ型をサポートしているので、そのように使用できると思いました。ただし、Visual Studioは、「'System.IO.BinaryWriter.Write(bool)'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります」と述べています。

すべてのプリミティブ型を含む長いswitchステートメントを記述しないようにし、型を選択するためのパラメーターをメソッドに追加しようとしています。これは醜く、正しくないようです。

これはシンプルでエレガントです。

  • Send <int>(123);
  • Send <bool>(true);

しかし、なぜそれが機能しないのですか?そして、それを行う正しい方法は何ですか?

4

1 に答える 1

3

過負荷解決はコンパイル時に実行されます。したがって、コンパイラは、*どのタイプでも有効なパラメータを持つメソッドを見つけようとしますT(その制約内で、ここでは役に立ちません)。そのような方法を見つけることができません。唯一の制約がT構造体でなければならないことであるとすると、有効な非ジェネリックパラメータータイプは(ボクシングを介して)のみになります。object

オブジェクトの実行時タイプに基づいて適切なオーバーロードを使用することが目的である場合は、次のように動的型付けを使用する必要があります。

public void Send(dynamic d) {
    BinaryWriter bw = new BinaryWriter(stream);
    bw.Write(d);
}

...または、リフレクションを使用して適切なオーバーロードをフェッチして実行します(これは動的型付けが行うことの一種です)。

于 2012-07-06T20:53:59.170 に答える