我按照本网站的建议制作了以下方法:
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
一起使用时,我仍然会收到以下错误:
类型'string'必须是非可空值类型才能在泛型类型或方法中将其用作参数'T'
有人可以告诉我为什么? THX
答案 0 :(得分:7)
您已将T
参数限制为
where T : struct
struct
限制意味着只能为T
提供值类型。 string
(更确切地说,System.String
)然而,是一个类,一个引用类型。
删除该限制并非易事,因为您使用T
作为T?
,即可以为T
。 Nullable<T>
反过来只接受值类型。
您必须决定是否要允许引用类型 - 如果您想限制T
引用类型,请使用class
约束而不是struct
(并删除来自?
的{{1}},因为引用类型总是可以自己为空。如果要同时允许值和引用类型,则无法生成T?
的可空版本。如果您需要所有这些,请扩展您对环境的描述,以便我们帮助您找到更好的解决方案。
答案 1 :(得分:3)
因为您将T限制为值类型 - where T : struct, IComparable
,而string是引用类型。
答案 2 :(得分:3)