C# 为什么在LINQ查询中转换为(int?)有效,而(string?)无效

C# 为什么在LINQ查询中转换为(int?)有效,而(string?)无效,c#,.net,linq,C#,.net,Linq,我正在编写一个简单的LINQ到XML查询。通常,XML文档中的某些节点可能缺少某些元素。为了解决这个问题,我尝试使用Scott Guthrie提出的可空类型和合并操作符。我注意到的效果是,将元素强制转换为(string?)dit不起作用,而将元素强制转换为(int?)效果很好。例如: var modules = from module in XMLConfig.Descendants("module") select new MyApp.Mod

我正在编写一个简单的LINQ到XML查询。通常,XML文档中的某些节点可能缺少某些元素。为了解决这个问题,我尝试使用Scott Guthrie提出的可空类型和合并操作符。我注意到的效果是,将元素强制转换为(string?)dit不起作用,而将元素强制转换为(int?)效果很好。例如:

var modules = from module in XMLConfig.Descendants("module")
                          select new MyApp.Modules.Manager
                          {
                              ManagerUrl = (string?)module.Element("Manager") ?? "http://localhost/default.asmx",
                              ManagerType = (int?) module.Element("ManagerType") ?? 1,
                              ManagerNumber = (int?) module.Element("ManagerNumber") ?? 1,
                              PrinterNr = (int?) module.Element("PrinterNr") ?? 1,
                              TextNr = (int?) module.Element("TextNr") ?? 100,
                              Name = module.Element("Name").Value
                      };
这给了我编译器错误:

无法将类型“字符串”转换为 “字符串”


但是,在转换为(int?)时没有任何投诉。如果有人能解释这种行为的原因(?)我将非常感激。

字符串是引用类型,即它已经是“可空的”。不需要像不能为
null
的值类型那样将其包装为null

这项工作:

ManagerUrl = (string)module.Element("Manager") ?? "http://localhost/default.asmx"
  • (string)module.Element(“Manager”)
    如果Manager元素不存在,则返回null,否则返回元素的内容

  • 如果ManagerType元素不存在,则
    (int)module.Element(“ManagerType”)
    将引发异常,因为
    int
    不能为null(值类型)

  • (int?)module.Element(“ManagerType”)
    如果缺少ManagerType元素,则不会引发异常,因为
    int?
    可以为null(可为null的类型)


    • 这是因为Nullable要求T是一个valuetype
      string
      是引用类型,因此始终可以为null。

      string是引用类型,因此可以为null。这个修饰符用于将可空性添加到不支持它的值类型。

      Thanx用于所有答案。我现在明白了!