C# 为什么在LINQ查询中转换为(int?)有效,而(string?)无效
我正在编写一个简单的LINQ到XML查询。通常,XML文档中的某些节点可能缺少某些元素。为了解决这个问题,我尝试使用Scott Guthrie提出的可空类型和合并操作符。我注意到的效果是,将元素强制转换为(string?)dit不起作用,而将元素强制转换为(int?)效果很好。例如: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
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"
如果Manager元素不存在,则返回null,否则返回元素的内容(string)module.Element(“Manager”)
- 如果ManagerType元素不存在,则
将引发异常,因为(int)module.Element(“ManagerType”)
不能为null(值类型)int
如果缺少ManagerType元素,则不会引发异常,因为(int?)module.Element(“ManagerType”)
可以为null(可为null的类型)int?
- 这是因为Nullable要求T是一个valuetype
string
是引用类型,因此始终可以为null。string是引用类型,因此可以为null。这个修饰符用于将可空性添加到不支持它的值类型。Thanx用于所有答案。我现在明白了!