0

我按照这个网站的建议做了以下方法:

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

但是当我尝试将它与 a 一起使用时,string我仍然收到以下错误:类型“字符串”必须是不可为空的值类型才能将其用作泛型类型或方法中的参数“T”

有人可以告诉我为什么吗?谢谢

4

3 回答 3

7

您已通过以下方式限制您的T参数

where T : struct

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

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

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

于 2013-06-28T11:12:37.220 回答
3

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

于 2013-06-28T11:11:39.340 回答
3

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

查看string类型文档以了解有关string.

于 2013-06-28T11:11:39.927 回答