0

ジェネリック型を固定型にキャストしようとしています。
以下は私が期待する動作ですが、根本的な欠陥があります。

public class Wrapper<T>
{
    public T Value;

    static public implicit operator TypeWithInt(Wrapper<int> wrapper)
    {
        return new TypeWithInt(wrapper.Value);
    }

    static public implicit operator TypeWithFloat(Wrapper<float> wrapper)
    {
        return new TypeWithFloat(wrapper.Value);
    }

    static public implicit operator TypeWithDouble(Wrapper<double> wrapper)
    {
        return new TypeWithDouble(wrapper.Value);
    }
}

上記のコードは、次のエラーでコンパイルされません。

User-defined conversion must convert to or from the enclosing type

As Wrapper<int>is different from Wrapper<T>it'll never work, becauseWrapper<int>は囲み型ではないため.

私の質問は次のとおりです。このキャスティングを機能させるにはどうすればよいですか? 方法はありますか?

4

2 に答える 2

3

.NET 型システムは一度に最大 2 つの型しか考慮しないため、オブジェクト モデルは少し無意味です。

/* type 1 (int) */ int a = "abc" /* type 2 (string) */;

それでも、メッシュしない中間の別のタイプを強制しようとしています。これは型変換プロセスの制限ではなく、言語の制限です。すべての割り当て (暗黙的な型変換が強制されるフェーズ) は、最大で 2 つのアクティブなパーティ (int上記の例では左側) と右側 (上の例では) を持つことができますstring。カスケードの暗黙的なキャストはサポートされておらず、コーディングが非常に難しい可能性があります。

私があなたの問題に対して考えられる唯一の解決策は、この移行をユーザーにもっと見やすくしToIntToFloatメソッドを追加しWrapper<T>て、それがその仕事をできるようにすることです。

別の興味深い点は、これを行うことによるパフォーマンスへの影響かもしれません...提案されたラッパーの最終的な結果は、かなりの負荷で作業している場合、残念なパフォーマンスにつながる可能性のあるボックス化操作です。別の方法は、アプリケーションを再設計して、タイプ固有性を低くすることです。そうすることで、現在直面している問題も解消される可能性があります。

于 2013-08-18T02:19:10.400 に答える