1

ジェネリックスを使用して整数型を受け取るメソッドを作成し、これらの型のメソッド内で基本的な数学演算を行うことはできますか?

私の状況: int 型の値を受け取り、その値が素数かどうかを返すメソッドを作成しました。後で大きな数値を処理するためにそのメソッドが必要になったので、入力タイプを Int64 に変更しましたが、これは速度に悪影響を及ぼします。ここでは効率が非常に重要です。

私はジェネリックについてほとんど知りませんでしたが、2 つのほぼ同一のオーバーロードされたメソッドを持つことはできないと考えていました。しかし、私はそれを機能させることができず、ジェネリックを間違って使用しようとしているからなのか、それとも構文エラーがあるのか​​ わかりません。

型を「int」と「UInt64」に限定すれば、メソッド内で「>」や「%」などの算術演算子を使えると思ったのですが、うまくいかないようです。

参照用のコード:

    /// <summary>
    /// Tests whether a number is prime.
    /// </summary>
    public static bool IsPrime<T>(T numToTest) where T: int, UInt64
    {
        List<T> primeList = new List<T>();
        primeList.Add(2); // Give the list an initial prime number. error here when using generics.
        return IsPrime(numToTest, primeList);
    }

    /// <summary>
    /// Tests whether a number is prime. Takes an initial list of primes as input to speed the method up.
    /// </summary>
    public static bool IsPrime<T>(T numToTest, List<T> primeList)
    {
        bool isPrime = true;
        T limit = (T)Math.Sqrt(numToTest); //error here when using generics.

        primeList = Prime.AllPrimesUnder(limit, primeList); // If we don't have enough primes to properly test the number, get more.

        foreach (T prime in primeList)
        {
            if (prime > limit) //error here when using generics.
                break;

            if (numToTest % prime == 0) //error here when using generics.
            {
                isPrime = false;
                break;
            }
        }

        return isPrime;
    }

私が知っている唯一の代替手段は、次のとおりです。

public static bool IsPrime<int>(int numToTest, List<int> primeList)
public static bool IsPrime<UInt64>(UInt64 numToTest, List<UInt64> primeList)
public static bool IsPrime<BigInteger>(BigInteger numToTest, List<BigInteger> primeList)

などなど...

4

3 に答える 3

3

dynamic.NET 4.0でキーワードを使用できます

public static T Add<T>(T x, T y)
{
    return (T)((dynamic)x+(dynamic)y);
}
static void Main(string[] args)
{
    int a=Add(10, 11);
    long b=Add(34L, 23L);
    uint c=Add(4u, 15u);
}

カスタムタイプでも

public struct MyInt
{
    public static MyInt operator+(MyInt a, MyInt b)
    {
    }
}

{
    MyInt d=new MyInt(...);
    MyInt e=new MyInt(...);
    MyInt f=Add(d, e);
}
于 2013-09-16T01:29:56.183 に答える