c# out 导致方法错误的无重载?

c# out causing a no overload for method error?

我是 c# 的新手,对 out 参数修饰符的工作原理有点困惑。

我有这个功能

public static void GuidUnsmash(string smashed, out Guid first, out Guid second)
{
    if (smashed.Length != 64)
    {
        throw new ArgumentOutOfRangeException();
    }

    string firstGuid = smashed.Substring(0, 32);
    string secondGuid = smashed.Substring(32, 32);

    first = new System.Guid(firstGuid);
    second = new System.Guid(secondGuid);
}

我正在尝试使用这个

[HttpGet]
public async Task<ActionResult> Pending(string pendingticket)
{
    // CAR-AAR built with PersonId and MonerisID in ticket, this was overkill, just needed the MonerisID
    GuidHelpers.GuidUnsmash(pendingticket, out Guid personId, out Guid monerisId); //this is the line that has the error
    var preload = await MonerisApplicationRepository.PrepareTransactionForMonerisPreload(monerisId);
    var preloadResponse = await MonerisRepository.PostPreloadTransactionRequest(preload);
    var persistPreload = await MonerisApplicationRepository.PersistMonerisPreloadTransactionResponse(monerisId, preloadResponse);

    var transactionRequest = preloadResponse.ToMonerisPreAuthorization();

    //var viewPendingRequest = new MonerisPendingPreloadTransaction(transactionRequest, preload);

    // View redirects to Moneris with autosubmit to begin preauthorization process.
    return View(transactionRequest);
}

但是我收到一条错误消息,指出 GuidUnsmash 没有重载方法。这让我很困惑,因为它们都有相同数量的参数。

通常,函数调用中使用的参数是"passed-by-value"。另一个选项是通过引用传递参数。

关键字ref 强制参数按引用传递。但这并不意味着该函数实际上会对变量任何事情。可能会也可能不会。

关键字out 强制参数按引用传递,并且值 在函数中赋值。这可能会对 readonly 等需要赋值的变量产生影响。因此调用者知道该值不会保持不变。

关键字in是相对较新的语法,与'ref'和'out'相关。它强制参数通过引用传递,但也防止值的任何重新分配(如倒置的 out)。但是我有点不确定你为什么要使用它。

在使用裸指针的语言中,通常使用裸指针来代替ref。并且没有 inout 关键字。

至于重载:

The in, ref, and out keywords are not considered part of the method signature for the purpose of overload resolution. Therefore, methods cannot be overloaded if the only difference is that one method takes a ref or in argument and the other takes an out argument.

这意味着错误没有实际意义。

因此留下了一个难以调试的问题:代码在这两个代码段之前或之间的某个地方被破坏了,编译器有问题甚至仍然告诉你错误在哪里。