「実数」型に対する C# ジェネリック制約はありますか? [重複] 質問する

「実数」型に対する C# ジェネリック制約はありますか? [重複] 質問する

重複の可能性あり:
C# の整数のみの汎用制約

こんにちは!

私は C# で直交座標系を設定しようとしていますが、座標値を 1 つの数値型に限定したくありません。コンテキストに応じて、座標値は整数になることもあれば、有理数になることもあります。

これは私にとっては「汎用クラス」のように思えますが、整数と浮動小数点の両方に型を限定する方法がわかりません。実数の概念をカバーするクラスが見つからないようです...

public class Point<T> where T : [SomeClassThatIncludesBothIntsandFloats?]  {
    T myX, myY;

    public Point(T x, T y) {
        myX = x;
        myY = y;
    }
}

Point<int> pInt = new Point<int>(5, -10);
Point<float> pFloat = new Point<float>(3.14159, -0.2357);

このレベルの自由度が必要な場合、クラス内の計算、ブール値、文字列、オブジェクトなどの除去に関して、「typeof(T)」の悪夢を選択することになるのでしょうか。あるいは、さらに悪いことに、処理したい数値の種類ごとに、それぞれ同じ内部数式を持つクラスを作成することを選択することになるのでしょうか。

ご協力いただければ幸いです。ありがとうございます!

ベストアンサー1

このような制約を定義することはできませんが、実行時に型をチェックすることはできます。ただし、計算を行うのには役立ちません。

計算をしたい場合は、次のようなオプションがあります。

class Calculations<T, S> where S: Calculator<T>, new()
{
    Calculator<T> _calculator = new S();

    public T Square(T a)
    {
        return _calculator.Multiply(a, a);
    }

}

abstract class Calculator<T>
{
    public abstract T Multiply(T a, T b);
}

class IntCalculator : Calculator<int>
{
    public override int Multiply(int a, int b)
    {
        return a * b;
    }
}

同様に、FloatCalculator必要な操作を定義します。特に高速ではありませんが、C# 4.0よりは高速です。dynamic構築する。

var calc = new Calculations<int, IntCalculator>();
var result = calc.Square(10);

副作用として、Calculator渡した型が一致するCalculator<T>実装を持つ場合にのみインスタンス化できるため、実行時の型チェックを行う必要がありません。

これは基本的にヘイルスバーグが言及していたことだこのインタビュー問題が議論されているところです。個人的には、何らかの基本型がまだあるといいのですが :)

おすすめ記事