8

私はこれをググることができないとは信じられません。何をググるのかわからない。

public static T GetValue<T>(T defaultValue)
{
  if (T is bool) // <-- what is the correct syntax here?
    return (T)true; // <-- I don't think this works either
}

編集:申し訳ありませんが、上記の機能は私の質問を表示するためだけのものです。それは実際の機能ではありません。答えてくれてありがとう!

4

3 に答える 3

22

これと同じメソッド/署名を使用する必要があり、次のタイプを使用する必要Tがある場合(そして、そのような理由ありますが、ない場合は、Albinの回答を参照してください):

public static T GetValue<T>(T defaultValue)
{
  // Need to use typeof to get a Type object for bool, just as with T
  if (typeof(T) == typeof(bool)) {
    // Need to say "get out of my way C#"
    // The first cast to object is required as true (bool) is
    // otherwise not castable to an unrestricted T.
    // This widen-restrict approach could result in a cast error,
    // but from the above check it is known that T is bool.
    return (T)(object)true;
  }
  // .. other stuff that .. does stuff.
}

ただし、明示的にtrue(ブール値のデフォルト値ではない)戻り、defaultValueそれ以外の場合は完全に無視するのは疑わしいようです。しかし-コンパイルします!それを出荷!

ノート:

  • ==タイプの使用は、サブクラスでは確実に機能しませんbool(ただし、構造体であるため、サブタイプは問題になりません)。そのような場合は、を見てくださいIsAssignableFrom
  • typeof(T)渡される値の型である必要はありません(null参照型の場合もあります)。これは、サブタイプとともにis、値を使用するアプローチに微妙な変化をもたらす可能性があります。
于 2012-11-22T06:27:29.943 に答える
13

タイプをチェックせず、変数をチェックしてください

public static T GetValue<T>(T defaultValue)
{
  if (defaultValue is bool) // <-- what is the correct syntax here?
    return (T)true;
}

しかし、ちょっとしたことではありませんが、型チェックを行い、ジェネリック型の型ごとに異なる処理を行う場合、通常は何か間違ったことをしています。

特別な処理を行うタイプのオーバーロードを作成してみませんか?

public static bool GetValue(bool defaultValue)
{
    return true;
}
于 2012-11-22T06:13:15.570 に答える
3

default(T)たぶんあなたは、提供されたタイプのデフォルト値を返すを探しています。のデフォルト値はboolですfalse

于 2012-11-22T06:22:48.407 に答える