2016-08-05 1 views
-3

私は以下の方法で質問がほとんどありません。エキスパートが構造を理解するのを手助けすることができますか?なぜ私はエラーを受けていますか?"型 '文字列'はnullableでない一般的なメソッドでなければなりません"

protected static T GetValue<T>(XElement group, string name, T default)  where T : struct 
{ 
      //Removed some code for better view 
      XAttribute setting = group.Attribute(name); 
      return setting == null ? default: (T)Enum.Parse(typeof(T), setting.Value); 
} 

私の質問は、およそ次のとおりです。

私は、XML要素を取得nameパラメータで指定された属性を検索した場合は、それはデフォルト値を返すXMLで見つけることができませんされます。このメソッドを持っていますこのメソッドで使用されるジェネリック型私は文字列変数に、このメソッドを使用しようとすると、私は次のエラーを取得する:

string test = GetValue(element, "search", "default value"); The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'GetValue(XElement, string, T)'

は何Tこの方法、それは私がそのエラーを取得しています問題ですか? T:structの意味はどこですか?私はGetValueとしてこれを使用しようとしましたが、それもうまくいきませんでした...

何か助けが本当に歓迎です!ありがとう!

+2

'T:struct' stringは構造体ではありません – Jonesopolis

+2

' string'は 'struct'ではありません。このメソッドは列挙型でのみ使用されるように見えます。あなたがしたいものに対しては 'string text =(string)element.Attribute(" search ")?? "デフォルト値"; ' – juharr

+0

[Constraints on Type Parameters(C#プログラミングガイド)](https://msdn.microsoft.com/en-us/library/d5x73970.aspx) – thehennyy

答えて

2

where T : structは、汎用タイプTの制約であり、意味はstructでなければなりません。 stringstructではないため、string、つまり"default value"が渡されているため、エラーが発生しています。

1

stringは、汎用制約where T : structにつき、structではありません。このメソッドは、Enum.Parseの使用に基づく列挙型でのみ使用されるようになっているようです。あなたが欲しいもののためにだけあなたにもほとんどの値の型と似た何かを行うことができます

string text = (string)element.Attribute("search") ?? "default value"; 

int value = (int?)element.Attribute("intAttribute") ?? -1; 

は、それが明示的にキャストすることのできるタイプのためXAttributeドキュメントをチェックアウトします。

しかし、これはenumに変換するためには機能しません。これは、そのメソッドが記述された理由です。

関連する問題