"类型'字符串'必须是一个不可空和通用的方法"

时间:2016-08-05 19:10:26

标签: c# generics methods

我在以下方法中几乎没有问题。专家能帮我理解结构以及我收到错误的原因吗?

我有这个方法将获取一个xml元素,搜索name参数中指定的属性,而case无法在xml中查找,它返回默认值:

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);
}

我的问题是关于此方法中使用的泛型类型。当我尝试在字符串变量中使用此方法时,我收到以下错误:

  

string test = GetValue(element,&#34; search&#34;,&#34;默认值&#34;);       类型&#39;字符串&#39;必须是不可为空的值类型才能将其用作参数&#39; T&#39;通用类型或方法&#39; GetValue(XElement,string,T)&#39;

这个方法的问题是什么?我遇到了这个错误的问题? T:struct的意思是什么?我试图将它用作GetValue,它也不能正常工作......

真的欢迎任何帮助!谢谢!

2 个答案:

答案 0 :(得分:2)

where T : struct是对通用类型T的约束,这意味着它必须是struct。由于string不是struct,并且您传递的是string,即"default value",您将收到错误。

答案 1 :(得分:1)

根据通用约束string

struct不是where T : struct。看起来该方法仅用于基于Enum.Parse的使用的枚举。对于你想做的事情

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

您可以使用大多数值类型执行类似的操作

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

查看XAttribute文档,了解可以明确转换为哪些类型。

然而,这不适用于转换为枚举,这可能是编写该方法的原因。