类型';字符串';必须是不可为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

类型';字符串';必须是不可为null的值类型,才能将其用作参数';T';在泛型类型或方法中

您已通过限制了T参数

where T : struct

struct限制意味着只能为T提供值类型。然而,string(更准确地说,System.String)是一个类,一个引用类型。

删除该限制并非易事,因为您使用T作为T?,即可为null的TNullable<T>则只接受值类型。

您必须决定是否允许引用类型-如果要将T限制为引用类型,请使用class约束而不是struct(并从T?中删除?,因为引用类型本身总是可以为null的)。如果要同时允许值类型和引用类型,则不能使T的版本为null。如果您需要所有这些,请扩展您对情况的描述,以便我们可以帮助您找到更好的解决方案。

字符串不是值类型,它是不可变的引用类型,因此它违反了T必须是struct的泛型约束。

有关string的更多详细信息,请参阅string类型文档。

因为您将T限制为值类型-where T : struct, IComparable,而字符串是引用类型。