空合并运算符怎么可能导致错误

本文关键字:错误 怎么可能 合并 运算符 | 更新日期: 2023-09-27 18:36:57

这很奇怪。

这与文章"将OAuth 2.0与Web应用程序一起使用(ASP.NET MVC)"有关:https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc

忽略整个代码,没必要,问题是这样的 - 有一种方法:

public class AppFlowMetadata : FlowMetadata
{
    private static string userId;
    public override string GetUserId(Controller controller)
    {
        if (userId == null)
        {
            userId = Guid.NewGuid().ToString();
        }
        return userId;
    }
}

就像魅力一样工作,永远不会失败

奇怪的是 - 如果我使用空合并运算符 (??) 而不是 IF 块:

    public override string GetUserId(Controller controller)
    {
        return userId ?? Guid.NewGuid().ToString();
    }

不断失败,引发异常:

Google.Apis.Auth.OAuth2.Responses.TokenResponseException: 错误:"invalid_grant", 描述:"无效代码。", uri:"

老实说,我相信这两个代码必须具有相同的效果。根据MSDN:

?? 运算符称为 null 合并运算符。它返回 如果操作数不为空,则为左操作数;否则返回 右手操作数。

有人可以向我解释一下吗? :)

更新我的坏,确实在第二个代码中没有将新的 Guid 分配给用户 ID。它应该是这样的:

userId = userId ?? Guid.NewGuid().ToString();
return userId;

空合并运算符怎么可能导致错误

这两种方法并不相同。

第一个将在每次调用时返回相同的 GUID(只要未在其他位置设置userID)。

第二个将在每次调用时返回不同的 GUID(除非userID在其他地方设置为不null )。