私はC#が新しく、テンプレートタイプに分散制限を適用しようとするといくつかの実際の問題があります。たぶん私の研究で見つけることができる唯一の "どこ"句の例は、他の方向に行くことにより基づいているのかもしれません(つまり、 "割り当てることができます")。私はエミュレートしようとしているScala関数を列挙しました - その点はTがUに代入可能であることを保証することです(つまりT <:U)。戻り値は何であれUであるためです。任意のヘルプまたはC#の分散についてのヒントは、ScalaのオプションからあなたにC#分散リターンタイプ
interface Option<out T> // where T : class
{
T GetUnsafe();
Option<X> map<X>(Func<object,Option<X>> f);
U GetOrElse<U>(U u) where T:U ; //What is wrong here,how do I get U:>T ?
bool IsSome { get; }
}
例に感謝し、高く評価され、[A] 最終DEF getOrElse [B>:A](デフォルト:⇒のB):B
として、更新は、ここでは静的関数として働いたバージョンだ - それはあなたが「ジェネリック型制約」と「一般的な差異を」混ぜるように見える方法
static class Option
{
public static U GetOrElse<T, U>(Option<T> o, U defAns) where T : U
{
if (o.IsSome) return o.GetUnsafe(); else return defAns;
}
これが機能するには、メソッドの代わりにインタフェースで 'U'を宣言する必要があります。 – juharr
前述のように、分散はインターフェイスのタイプパラメータでのみ機能します。とにかく、メソッドに必要な制約は有効ではありません(クラスの一部を継承するメソッドの型パラメーターのみを制約できます)。それは、IMHOそれはそのような方法を持つのは厄介なデザインだと言った。なぜメソッドが 'T'を返すことができないのですか? 'Option'を持っている人にとって、 'GetorElse ()'という型パラメータを 'T 'の基本型にするだけでいいのですか?あなたの質問は、[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)に非常によく似ています。 –
@PeterDuniho私はこれが奇妙に見えるかもしれないが、私の発明ではないことを知っています。ここでは、Uがこのように限定されている必要がある理由の例を示します。これはオブジェクトであると言われています。ですが、内部コードがないのに、オプションを扱うコードにアップキャストされています。その瞬間に呼び出すコールは、Uがそのアイテムのスーパータイプであることを保証する必要があります。そうしないと、完全に間違ってしまうでしょう。 Var Cat = myCat.getOrElse(123455)は問題になります。 –
LaloInDublin