5

C++ では、次のようなコードを記述できます。

template<class T>
T Add(T lhs, T rhs)
{
    return lhs + rhs;
}

ただし、C# では次のようなことはできません。

public static T Add<T>(T x, T y) where T : operator+
{
    return x + y;
}

何か理由はありますか?リフレクションによって実現できることはわかっていますが (Addオブジェクトをジェネリックにしてから、すべてに対して型チェックを実行します)、それは非効率的であり、うまくスケーリングできません。では、なぜですか?

4

3 に答える 3

5

これが存在できなかった固有の理由はありません。ジェネリック型の制約を実装する方法は、インターフェース呼び出しを介して行われます。これを提供するインターフェースがあれば、operator+これは機能します。

ただし、このインターフェイスは、関連するすべてのタイプで、C++テンプレートベースのアナログと同じくらい一般的である必要があります。

もう1つの問題は、.NETに多重ディスパッチがないことです。インターフェイス呼び出しは非対称になります。a.Plus(b)は、とは異なる意味を持つ可能性がありb.Plus(a)ます。Equalsところで、同じ問題があります。

したがって、この問題はおそらく「有用性」バーまたは「コスト/ユーティリティ」バーを満たしていませんでした。これは不可能の問題ではなく、実際的な懸念の問題です。

それが可能であることの証明:((dynamic)a) + ((dynamic)b)

于 2013-01-15T18:21:53.590 に答える
3

CLR はそのような制約をネイティブにサポートしていません。C# 設計チームは明らかに、CLR と同じ一連の制約をサポートすることを決定しました。おそらく、CLR チームと C# チームの両方が、そのような機能を実装する利点は、その仕様、実装、およびテストのコストを上回らないと感じていました。

このような制約をサポートする .NET 言語を使用する場合は、F# を検討することを検討してください。

于 2013-01-15T18:19:16.130 に答える
0

演算子の制約を実装するにはいくつかの方法が考えられますが、それらはすべて自明ではない (おそらく CLR の変更が必要になる) か、重大な欠点があります (たとえば、2 つの整数を加算するよりもはるかに遅くなります)。

そして、これは比較的簡単に回避できるものです ( を使用する低速で一般的で安全でない方法dynamicか、高速でタイプ固有の安全な方法で無数のオーバーロードを使用するかのいずれか)。そのため、そのような機能はおそらく「あると便利」と考えられますが、そのような変更を保証するほど重要ではありません。

于 2013-01-15T20:52:06.960 に答える