ジェネリック型指定引数-オプションの場合もありますが、常にではありません

リチャードEv

この質問は、ジェネリック型仕様の引数を含める必要がある場合と含める必要がない場合に関するものです。少し長いのでご容赦ください。

次の(考案された)クラスがある場合...

public abstract class UserBase
{
    public void DoSomethingWithUser() { }
}

public class FirstTimeUser : UserBase
{
     /* TODO: some implementation */
}

次の方法...

private static void DoThingsWithUser<TUser>(TUser user) where TUser : UserBase
{
    user.DoSomethingWithUser();
}

type引数を指定する必要がある場合とない場合で呼び出すことができますTUser...

var user = new FirstTimeUser();

DoThingsWithUser<FirstTimeUser>(user);
DoThingsWithUser(user); // also valid, and less typing required!

ここまでは順調ですね。

しかし、さらにいくつかの(再び考案された)クラスを追加すると...

public abstract class UserDisplayBase<T> where T : UserBase
{
    public T User { get; protected set; }
}

public class FirstTimeUserDisplay : UserDisplayBase<FirstTimeUser>
{
    public FirstTimeUserDisplay()
    {
        User = new FirstTimeUser();
    }
}

そして方法...

private static void DoThingsWithUserDisplay<TDisplay, TUser>(TDisplay userDisplay)
    where TDisplay : UserDisplayBase<TUser>
    where TUser : UserBase
{
    userDisplay.User.DoSomethingWithUser();
}

このメソッドを呼び出す場合、必須型引数を含めるように...

var userDisplay = new FirstTimeUserDisplay();
DoThingsWithUserDisplay<FirstTimeUserDisplay, FirstTimeUser>(userDisplay); // Type arguments required!

型引数を指定しない場合、次のコンパイラエラーが発生します。

メソッド 'DoThingsWithUserDisplay(TDisplay)'の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

私が考えて、コンパイラが/このアウトを理解するために、スマートに十分な可能性がなければならないこと...かなぜない微妙な理由があるのでしょうか?

Grax32

コンパイラーが推測する型を分析しているので、見ると行き止まりになります DoThingsWithUserDisplay(userDisplay);

それはTDisplayタイプなければならないことがわかりFirstTimeUserDisplayます。これは良いことです。次に、制約は、TDisplayから継承する必要があることを示しUserDisplayBase<TUser>ます。

の型がわからTUserないため、FirstTimeUserDisplay継承元かどうか判断できずUserDisplayBase<TUser>、またTUser、ジェネリックにある型が何であれパラメータを推測することもできませんUserDisplayBase<TUser>

編集:ちなみに、バリアントとのインターフェイスを使用して、探している型推論を取得できます。この場合、インターフェース定義は、制約が満たされるように十分な継承情報を提供します。

public abstract class UserDisplayBase<T> : IUserDisplayBase<T>
    where T : UserBase
{
    public T User { get; protected set; }
}

public interface IUserDisplayBase<out T>
    where T : UserBase
{
    T User { get; }
}

private static void DoThingsWithUserDisplay<TDisplay>(TDisplay userDisplay)
    where TDisplay : IUserDisplayBase<UserBase>
{
    userDisplay.User.DoSomethingWithUser();
}

で呼び出すことができます

var userDisplay = new FirstTimeUserDisplay();
DoThingsWithUserDisplay(userDisplay);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ジェネリッククラスの型引数がありません

分類Dev

拡張クラスを具体的に指定するジェネリック型引数?

分類Dev

Powershell関数-パラメーターは、ある場合には必須であり、別の場合はオプションである必要があります

分類Dev

ジェネリック引数を指定せずにkeyof型であるジェネリック型を絞り込む

分類Dev

コレクション型はジェネリックではありません。引数<?E>を拡張します

分類Dev

引数がジェネリックの場合、戻り値の型 `this`は台無しになります

分類Dev

ジェネリック; 型引数がその範囲内にありません

分類Dev

Javaジェネリックスのジェネリック型引数

分類Dev

Java 8-ジェネリック型を期待するメソッドに生の型引数を指定すると、戻り型が消去されます

分類Dev

EfCore REST-API:ステートレスアプリケーションの場合、クエリは常にAsNoTrackingである必要があります

分類Dev

変数をオプション値として宣言する場合、Swiftenumには「rawValue」という名前のメンバーがありません

分類Dev

変数をオプション値として宣言する場合、Swiftenumには「rawValue」という名前のメンバーがありません

分類Dev

ジェネリック引数型のSwift関数

分類Dev

テンプレート引数としてジェネリック列挙型を指定します

分類Dev

ジェネリッククラスで列挙型を使用するときに型引数を指定する必要があるのはなぜですか

分類Dev

Androidアプリケーションの場合-テキストを選択するためのカーソルは白で、切り取り、コピー、貼り付けのオプションも白であるため、表示できません

分類Dev

Java8でストリームを使用する場合、常にオプションをチェックする必要がありますか?

分類Dev

org.hibernate.AnnotationException:コレクションにジェネリック型もOneToMany.targetEntity()もありません

分類Dev

`typeof T`でジェネリック型引数を使用する

分類Dev

エラーを克服するためのよりエレガントな方法は何ですか:オブジェクト指定子を期待しています。JXA経由でメッセージ経由でSMSを送信する場合、引数にはオブジェクト指定子がありません

分類Dev

Javaジェネリック型の引数

分類Dev

ジェネリック型引数の問題

分類Dev

タイプ「Queryable」のジェネリックメソッド「OrderBy」は、指定されたタイプ引数と互換性がありません

分類Dev

VBA:引数はオプションではありません

分類Dev

動的オプションの付加価値jqueryの場合、ドロップダウンデザインが適切ではありません

分類Dev

Dapper QueryMultipleを使用するときに、ジェネリック引数に型を指定する

分類Dev

GetIntent()。getExtras()は、アプリケーションが最近のものである場合、空になることがよくあります-Android

分類Dev

Typescriptジェネリックラッパー:型指定されていない関数呼び出しは型引数を受け入れない場合があります

分類Dev

Atomの「プロジェクトで検索」パネルに検索オプションがありません

Related 関連記事

  1. 1

    ジェネリッククラスの型引数がありません

  2. 2

    拡張クラスを具体的に指定するジェネリック型引数?

  3. 3

    Powershell関数-パラメーターは、ある場合には必須であり、別の場合はオプションである必要があります

  4. 4

    ジェネリック引数を指定せずにkeyof型であるジェネリック型を絞り込む

  5. 5

    コレクション型はジェネリックではありません。引数<?E>を拡張します

  6. 6

    引数がジェネリックの場合、戻り値の型 `this`は台無しになります

  7. 7

    ジェネリック; 型引数がその範囲内にありません

  8. 8

    Javaジェネリックスのジェネリック型引数

  9. 9

    Java 8-ジェネリック型を期待するメソッドに生の型引数を指定すると、戻り型が消去されます

  10. 10

    EfCore REST-API:ステートレスアプリケーションの場合、クエリは常にAsNoTrackingである必要があります

  11. 11

    変数をオプション値として宣言する場合、Swiftenumには「rawValue」という名前のメンバーがありません

  12. 12

    変数をオプション値として宣言する場合、Swiftenumには「rawValue」という名前のメンバーがありません

  13. 13

    ジェネリック引数型のSwift関数

  14. 14

    テンプレート引数としてジェネリック列挙型を指定します

  15. 15

    ジェネリッククラスで列挙型を使用するときに型引数を指定する必要があるのはなぜですか

  16. 16

    Androidアプリケーションの場合-テキストを選択するためのカーソルは白で、切り取り、コピー、貼り付けのオプションも白であるため、表示できません

  17. 17

    Java8でストリームを使用する場合、常にオプションをチェックする必要がありますか?

  18. 18

    org.hibernate.AnnotationException:コレクションにジェネリック型もOneToMany.targetEntity()もありません

  19. 19

    `typeof T`でジェネリック型引数を使用する

  20. 20

    エラーを克服するためのよりエレガントな方法は何ですか:オブジェクト指定子を期待しています。JXA経由でメッセージ経由でSMSを送信する場合、引数にはオブジェクト指定子がありません

  21. 21

    Javaジェネリック型の引数

  22. 22

    ジェネリック型引数の問題

  23. 23

    タイプ「Queryable」のジェネリックメソッド「OrderBy」は、指定されたタイプ引数と互換性がありません

  24. 24

    VBA:引数はオプションではありません

  25. 25

    動的オプションの付加価値jqueryの場合、ドロップダウンデザインが適切ではありません

  26. 26

    Dapper QueryMultipleを使用するときに、ジェネリック引数に型を指定する

  27. 27

    GetIntent()。getExtras()は、アプリケーションが最近のものである場合、空になることがよくあります-Android

  28. 28

    Typescriptジェネリックラッパー:型指定されていない関数呼び出しは型引数を受け入れない場合があります

  29. 29

    Atomの「プロジェクトで検索」パネルに検索オプションがありません

ホットタグ

アーカイブ