【问题标题】:"The type 'string' must be a non-nullable and generic method"“‘字符串’类型必须是不可为空的泛型方法”
【发布时间】:2026-01-28 13:50:02
【问题描述】:

我对以下方法有几个问题。专家能否帮助我了解结构以及我收到错误的原因?

我有这个方法会得到一个xml元素,搜索name参数中指定的属性,在xml中找不到case,它返回默认值:

protected static T GetValue<T>(XElement group, string name, T default)     where T : struct
{
            //Removed some code for better view
            XAttribute setting = group.Attribute(name);
            return setting == null ? default: (T)Enum.Parse(typeof(T), setting.Value);
}

我的问题是关于此方法中使用的泛型类型。当我尝试在字符串变量中使用此方法时,出现以下错误:

string test = GetValue(element, "search", "default value"); 类型“字符串”必须是不可为空的值类型,才能将其用作泛型类型或方法“GetValue(XElement, string, T)”中的参数“T”

这个方法是什么,我得到那个错误的问题是什么?是什么意思?我尝试将其用作 GetValue,但效果不佳...

非常欢迎任何帮助!谢谢!

【问题讨论】:

  • where T : struct 字符串不是结构体
  • string 不是struct。看起来该方法仅适用于枚举。你想做的事就做string text = (string)element.Attribute("search") ?? "default value";
  • 你应该阅读一些关于约束的内容,例如这里Constraints on Type Parameters (C# Programming Guide)
  • @Rahul 是的,有时我的 cmets 过火了。
  • @thehennyy 谢谢!我不知道那个名字。我会阅读更多相关信息!再次感谢!

标签: c# generics methods


【解决方案1】:

where T : struct 是泛型类型T 的约束,这意味着它必须是struct。由于string 不是struct 并且您传递的是string,即"default value",因此您会收到错误消息。

【讨论】:

    【解决方案2】:

    string 不是struct 根据通用约束where T : struct。看起来该方法仅适用于基于Enum.Parse 使用的枚举。做你想做的事

    string text = (string)element.Attribute("search") ?? "default value"; 
    

    您也可以对大多数值类型执行类似的操作

    int value = (int?)element.Attribute("intAttribute") ?? -1;
    

    查看XAttribute 文档,了解可以显式转换为哪些类型。

    但是,这对于转换为枚举不起作用,这可能是编写该方法的原因。

    【讨论】:

      最近更新 更多