为什么在LINQ查询中,(int?)的转换工作而(string?)不起作用

Tom*_*ter 2 .net c# linq

我正在编写一个简单的LINQ to XML查询.通常,XML文档中的某些节点可能缺少某些元素.为了解决这个问题,我试图使用可靠类型和Scott Guthrie提出的合并运算符.我注意到的Whan效果是,在转换为(int?)时,将元素转换为(string?)dit不起作用.一个例子:

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
                      };
Run Code Online (Sandbox Code Playgroud)

这给了我编译错误:

无法转换类型'字符串?' '串'

但是,在转换为(int?)时没有任何抱怨.如果有人能解释这种行为的原因(?)我真的很感激.

dtb*_*dtb 8

字符串是引用类型,即它已经是"可空的".没有必要将它包装在Nullable <T>中,因为值类型是不可能的null.

这有效:

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

  • (int)module.Element("ManagerType")如果ManagerType元素不存在则会抛出异常,因为a int不能为null(值类型).

  • (int?)module.Element("ManagerType")如果缺少ManagerType元素,则不会抛出异常,因为a int?可以为null(可空类型).


San*_*ken 5

这是因为Nullable要求T是一个值类型.string是一种引用类型,由于这个原因,它总是可以为空的.