【问题标题】:Cannot convert from out System.Guid? to System.Guid无法从 System.Guid 转换?到 System.Guid
【发布时间】:2021-12-09 13:04:05
【问题描述】:

我正在尝试将字符串解析为可为空的 guid。根据 TryParse 结果,可为空的 guid 应存储值或为空。

private Guid? GetData()
{
    string carName = "Volvo";
    Guid? data = Guid.TryParse(carName, out data) ? (Guid?)data : null;
    
    return data;
}

我在 out data 上收到一个编译时错误消息

无法从 System.Guid 转换?到 System.Guid

【问题讨论】:

  • Guid? data = Guid.TryParse(carName, out var parsed) ? parsed : null;
  • TryParse 方法不接受第二个参数作为可空类型,因此您需要先解析一个特定的参数,然后在您的条件下使用它:Guid? data = Guid.TryParse(carName, out Guid outputData) ? outputData : null;
  • @yemo var 无论如何都会推断出类型为Guid

标签: c# .net


【解决方案1】:

您需要使用不同的变量名:

Guid? data = Guid.TryParse(carName, out Guid _data) ? (Guid?)_data : null;

目前,您对两者都使用data

  • 最终结果(Guid?)和
  • TryParseout 参数(必须是Guid,而不是Guid?)。

【讨论】:

  • 名称_data在当前上下文中不存在
  • @user1765862 out var _data
【解决方案2】:

让它简单、合乎逻辑、易读

if (Guid.TryParse(carName, out Guid g)
    return g;
return null;

如果 3 行让你感到困扰

return Guid.TryParse(carName, out Guid g) ? g : (Guid?)null;

【讨论】:

  • 我肯定最喜欢这 3 行。它很好地显示了意图,而单行则难以阅读。
  • 没错!有时人们会用复杂的 linq 给出答案,而开发人员可能需要了解逻辑流程。对于生产代码,为了清楚起见,有时最好多加一行或两行 - 你是对的
【解决方案3】:

最好不要在一行中做这么多。这将使其更易于阅读和理解。

private Guid? GetData()
    {
        string carName = "Volvo";
        // First try to parse the string into a guid
        var canParse = Guid.TryParse(carName, out var data);

        // Return either the converted value or null
        return canParse ? data : null;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多