类型';字符串';必须是不可为null的值类型,才能将其用作参数';T';在泛型类型或方法中
本文关键字:类型 参数 泛型类型 方法 字符串 null | 更新日期: 2023-09-27 18:20:19
我遵循这个网站的建议,制定了以下方法:
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"必须是不可为null的值类型,才能将其用作泛型类型或方法中的参数"T"
有人能告诉我为什么?Thx
您已通过限制了T
参数
where T : struct
struct
限制意味着只能为T
提供值类型。然而,string
(更准确地说,System.String
)是一个类,一个引用类型。
删除该限制并非易事,因为您使用T
作为T?
,即可为null的T
。Nullable<T>
则只接受值类型。
您必须决定是否允许引用类型-如果要将T
限制为引用类型,请使用class
约束而不是struct
(并从T?
中删除?
,因为引用类型本身总是可以为null的)。如果要同时允许值类型和引用类型,则不能使T
的版本为null。如果您需要所有这些,请扩展您对情况的描述,以便我们可以帮助您找到更好的解决方案。
字符串不是值类型,它是不可变的引用类型,因此它违反了T必须是struct
的泛型约束。
有关string
的更多详细信息,请参阅string
类型文档。
因为您将T限制为值类型-where T : struct, IComparable
,而字符串是引用类型。