3

.Net に数値のポリモーフィズムがないこと、つまり、bool、byte、uint、int などのさまざまな種類の数値型を統一する INumeric インターフェイスがないことは本当に残念です。極端な場合、抽象の完全なパッケージが必要です。代数型。

Joe Duffy には、この問題に関する記事があります。

http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx

.Net や C# に影響を与えることなく、これを改良するために、C# でこれをどのように表現しますか?

最初に 1 つ以上の抽象型 (INumeric などのインターフェイス、またはそれ以上の抽象型) を定義してから、これらを実装する構造体を定義し、新しい型を返す操作を提供しながら int などの型をラップするという 1 つのアイデアがあります (例: Integer32 : INumeric; ここで加算は次のように定義されます

public Integer32 Add(Integer32 other)
{
    return Return(Value + other.Value);
}

このコードの実行速度が少し心配ですが、少なくとも抽象的です。

良さをオーバーロードする演算子はありません...

他のアイデアはありますか?

.Net は、この種の抽象化がなく、効率的であることができない場合、実行可能な長期的なプラットフォームのようには見えません。

抽象化は再利用です。

アップデート:

これは、これまでの実装型シグネチャの例です。

public struct Integer32 : INumeric<Integer32, Int32>, IOrder<Integer32, Int32>

共変の戻り値の型の欠如を補う。

4

3 に答える 3

5

あなたのデレンマを解決するかもしれない何かを書く努力を、誰かがすでに行っています。これはGeneric Operatorsと呼ばれ、 Miscellaneous Utility Libraryで利用できます。

于 2010-03-08T21:21:01.880 に答える
0

C# 4.0 を使用する場合は、 を使用して一般的な数学演算を簡単にシミュレートできますdynamic。簡単な加算関数の例を次に示します (詳細については、このブログを参照してください)。

public static T Add<T>(T a, T b) {
  dynamic ad = a;
  dynamic bd = b;
  return ad + bd;
}

私はこれで遊んだことがないので、パフォーマンスについてはあまり言えません。動的を使用すると確かにパフォーマンスが犠牲になりますが、関数を複数回呼び出す場合、DLR は非常に効果的な最適化を行うことができるはずです。実際、前述のGeneric Operatorsと同様のパフォーマンス プロファイルがあったとしても、私は驚かないでしょう。

于 2010-03-09T02:47:49.597 に答える