类型'string'必须是非可空值类型才能在泛型类型或方法中将其用作参数'T'

时间:2013-06-28 11:09:58

标签: c#

我按照本网站的建议制作了以下方法:

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

3 个答案:

答案 0 :(得分:7)

您已将T参数限制为

where T : struct

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

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

您必须决定是否要允许引用类型 - 如果您想限制T引用类型,请使用class约束而不是struct(并删除来自?的{​​{1}},因为引用类型总是可以自己为空。如果要同时允许值和引用类型,则无法生成T?的可空版本。如果您需要所有这些,请扩展您对环境的描述,以便我们帮助您找到更好的解决方案。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

有关string

的更多详细信息,请查看string类型文档
相关问题