0

この Web サイトに関する提案に従って、次の方法を作成しました。

public static T? GetElementValue<T>(this XElement xElement, string s) 
    where T : struct, IComparable
{
     var result = new Nullable<T>();

     try
     {
         if (string.IsNullOrEmpty(s) || s.Trim().Length > 0 || xElement.IsEmpty)
            return result;

         var element = xElement.Element(s);

         if (element == null || element.IsEmpty)
             return result;

         var conv = TypeDescriptor.GetConverter(typeof(T));
         result = (T)conv.ConvertFrom(element.Value);
     }
     catch (Exception ex)
     {
          ex.Message.WriteAsError();
     }

     return result;
}

しかし、それを使用しようとすると、stringまだ次のエラーが発生します: 型 '文字列' は、ジェネリック型またはメソッドでパラメーター 'T' として使用するために、null 非許容値型である必要があります

誰かが理由を教えてくれますか?どうも

4

3 に答える 3

7

Tパラメータを次のように制限しました:

where T : struct

このstruct制限は、 には値型のみを指定できることを意味しますTstring(より正確にはSystem.String) ただし、はクラス、参照型です。

Tas T?、つまり nullableを使用するため、その制限を取り除くことは簡単ではありませんTNullable<T>次に、値の型のみを受け入れます。

参照型を許可するかどうかを決定する必要があります-参照型に制限したい場合は、代わりに制約をT使用します(参照型は常にそれ自体でnull可能であるため、 fromを削除します)。値型と参照型の両方を許可する場合、 の null 許容バージョンを作成することはできません。これらすべてが必要な場合は、より良い解決策を見つけるお手伝いができるよう、状況の詳細をお知らせください。classstruct?T?T

于 2013-06-28T11:12:37.220 に答える
3

T を値型 - に制限しているのwhere T : struct, IComparableに対し、 string は参照型であるためです。

于 2013-06-28T11:11:39.340 に答える
3

文字列は値型ではなく、不変の参照型であるため、 T が a でなければならない一般的な制約に違反しますstruct

stringの詳細については、タイプのドキュメントを参照してくださいstring

于 2013-06-28T11:11:39.927 に答える