6

ジェネリック入力を受け入れ、入力がデフォルトの場合は null を返し、それ以外の場合は XElement を返すメソッドを作成しようとしています。

ところで、私はジェネリック メソッドと明らかに google-fu にかなりグリーンです。

これが私がこれまでに持っているものです:

public static class ConversionClass<T>
{
    public static XElement newXElementOrNull<T>(string name, T val)
    {
        if ((T.type == "String") && (val == String.Empty))
        {
            return null;
        }

        if (val == default(T))
        {
            return null;
        }
        else
        {
            return new XElement(name, val);
        }
    }
}

何らかの理由で、C# はこれを好みません。

メソッドのシグネチャ (newXElementOrNull) を次のように述べています。

型パラメーター 'T' は、外部型 'AddXMLTest.Converter' の型パラメーターと同じ名前です

また、山括弧内の T とパラメーター内の T が強調表示されます。

さらに悪いことに、val == default(T) の部分は好きではありません。演算子 '==' は型 'T' および 'T' のオペランドには適用できないと書かれているからです。

私は何を間違っていますか?

4

4 に答える 4

6

どうやらこのメソッドは、すでに指定されているクラス内にあります<T>。つまり、この型パラメーターを省略できることを意味します。ジェネリック クラスのメソッドも自動的にジェネリックになります。

エラーも発生すると予想T.typeされますが、それは外部クラスの型制約に依存します。完全な回答を得るには、そのクラスの外部定義 (すべてのメンバーではない) を投稿してください。

それは好きではありませんval == default(T)

これはおそらく最初のフォローアップ エラーです。

于 2013-03-08T19:02:21.093 に答える
3

型パラメーター 'T' は、外部型 'AddXMLTest.Converter' の型パラメーターと同じ名前です

したがって、このメソッドの外側のクラス (表示されていません) も使用<T>している必要があります。あなたはそれをすることができません。(メソッド上で) のような名前を付け<K>ます。

さらに悪いことに、val == default(T) の部分が好きではありません。演算子 '==' は、タイプ 'T' および 'T' のオペランドには適用できないと書かれているからです。

<T>これは、使用をやめてのように変更すると解決するはずですdefault(K)

T.typeさらに、これはコンパイルできないと確信しています。評価は次のようにする必要があると確信しています。

if ((val is typeof(string) && string.IsNullOrEmpty(val))
于 2013-03-08T19:03:58.177 に答える
1

あなたができるよりも早くT.typeできないString.type、またはMyClass.type

あなたが探しているのは次のようなものです

typeof(T) == typeof(String)
于 2013-03-08T19:05:03.957 に答える
0

と の 2 つの無効なものがT.type == "String" && val == String.Emptyありval == default(T)ます。どうですか:

public static XElement newXElementOrNull<T>( string name, T val ) {
   if ( typeof(T) == typeof(String) && val.ToString() == String.Empty ) {
      return null;
   }

   if ( EqualityComparer<T>.Default.Equals( val, default( T ) ) ) {
      return null;
   }
   else {
      return new XElement( name, val );
   }
}
于 2013-03-08T19:08:08.447 に答える