1

ジェネリック構造体と、ジェネリック型パラメーターが定義された 2 つのシノニムがあります。次のように、これら 2 つの型の間の型変換を定義したいと思います。

using X = A<int>;
using Y = A<long>;

struct A<T>
{
    private T data;

    public A(T data)
    {
        this.data = data;
    }

    public static explicit operator X(Y value)
    {
        return new X((int)value.data);
    }
    public static implicit operator Y(X value)
    {
        return new Y(value.data);
    }
}

構造体をどのように使用するかの例を次に示します。

class Program
{
    static void Main(string[] args)
    {
        X x = new X(1);
        Y y = new Y(2);

        x = (X)y; // explicit cast with precision loss
        y = x; // implicit cast without precision loss
    }
}

残念ながら、「使用」するたびに構造体の新しい特定の定義が作成され、C# コンパイラはシノニム構造体を汎用構造体のサブセットとしてではなく、個別の構造体として扱います。そのため、コンパイラはエラーを報告します。

  1. 「X.static 暗黙演算子 Y(X) と Y.static 暗黙演算子 Y(X) の間があいまい」。
  2. 「ユーザー定義の変換は、囲んでいる型との間で変換する必要があります」。

型を class に変更せずにこの型変換を実現する方法を知っている人はいますか?

更新:.NET 4 を使用しています。

4

1 に答える 1

1

エラー

ユーザー定義の変換は、外側の型との間で変換する必要があります。

は、変換演算子が との間で変換する必要があることを意味しますA<T>。あなたは との間で変換していA<int/string>ます。それは同じことではありません (少なくとも一般的ではありません)。

したがって、これは機能しません。変換を行う別の方法を見つける必要があります。ランタイム キャストがここで役立つ可能性があります (演算子を作用するものとして定義し、A<T>その中でキャストを行います)。

この問題は型シノニムとは無関係だと思います。実際、彼らは質問を理解しにくくしました。

于 2013-06-04T09:38:22.773 に答える