【问题标题】:Default values parameters not taken into account in C#C# 中未考虑默认值参数
【发布时间】:2021-07-20 16:40:47
【问题描述】:

我已经下载了 QRCoder 源代码,并使用 Visual Studio 2019 编译了这些源代码。 然后我在我的 Visual stuio 2008 项目中添加对从文件夹“net35”生成的 QRCODER.dll 的引用。

然后我尝试开始一个小演示:

QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.",         
QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData);

编译器给出一个错误,说没有找到方法匹配(我只传递了一个字符串和一个错误级别)。在源代码中,我看到了具有默认值的方法签名:

public QRCodeData CreateQrCode(string plainText, ECCLevel eccLevel, bool forceUtf8 = false, bool utf8BOM = false, EciMode eciMode = EciMode.Default, int requestedVersion = -1)
{
    return GenerateQrCode(plainText, eccLevel, forceUtf8, utf8BOM, eciMode, requestedVersion);
}

所以问题是:为什么我不能只用 2 个参数(字符串和错误级别)调用方法?

我的解决方案是显式添加一个带有 2 个参数的方法(在源文件中),然后从该方法的主体中使用默认值调用该方法。之后,我在 Visual Studio 2008 的项目中编译和引用 dll,现在,编译器不再给出错误 .... 是否支持方法中的 theframework.net 3.5 默认值 ... 或 ...?

  /// <summary>
        /// Calculates the QR code data which than can be used in one of the rendering classes to generate a graphical representation.
        /// </summary>
        /// <param name="plainText">The payload which shall be encoded in the QR code</param>
        /// <param name="eccLevel">The level of error correction data</param>
        /// <param name="forceUtf8">Shall the generator be forced to work in UTF-8 mode?</param>
        /// <param name="utf8BOM">Should the byte-order-mark be used?</param>
        /// <param name="eciMode">Which ECI mode shall be used?</param>
        /// <param name="requestedVersion">Set fixed QR code target version.</param>
        /// <exception cref="QRCoder.Exceptions.DataTooLongException">Thrown when the payload is too big to be encoded in a QR code.</exception>
        /// <returns>Returns the raw QR code data which can be used for rendering.</returns>
        public QRCodeData CreateQrCode(string plainText, ECCLevel eccLevel, bool forceUtf8 = false, bool utf8BOM = false, EciMode eciMode = EciMode.Default, int requestedVersion = -1)
        {
            return GenerateQrCode(plainText, eccLevel, forceUtf8, utf8BOM, eciMode, requestedVersion);
        }

        public QRCodeData CreateQrCode(string plainText, ECCLevel eccLevel)
        {
            return GenerateQrCode(plainText, eccLevel);
        }

【问题讨论】:

  • 请在提交之前使用预览检查您的帖子是否可读。您的代码格式均不正确,因为您使用了撇号而不是反引号。有关格式化帖子的更多详细信息,请参阅stackoverflow.com/editing-help
  • Microsoft 经常将方法的参数从一个版本的 Net 更改为下一个版本的 Net。
  • @jdweng:不,他们真的没有。微软对向后兼容性非常严格。请注意,这与 .NET Framework 中的方法无关——它与 OP 的方法有关。问题只是 C# 3 不支持可选参数。
  • @JonSkeet:真的吗?从 Net 3.5 到 Net 4.0 时,您必须在 Net 4.0 中添加 SMTP Nnetwork 凭据,但在 Net 3.5 中没有。那么密码学和 TLS 呢?不要说微软对向后兼容性很严格。这是微软最后的担忧。自去年 6 月对 TLS 服务器进行安全升级以禁用 TLS 1.0 和 1.1 并且没有为客户端提供任何解决方案以来,情况一直很糟糕。我已经回答了 3 或 4 个关于这个问题的帖子。
  • @jdweng:这些都不是“改变方法的参数”——当替代方案是安全漏洞时,IMO 删除对旧的和不安全的协议的支持是完全合理的。向后兼容完美吗?没有。微软对它很严格吗?绝对 - 考虑到他们所覆盖的 巨大 表面积,他们在这方面做得非常出色。

标签: c# .net-3.5


【解决方案1】:

方法中是否支持framework.net 3.5默认值

.NET Framework 3.5 版支持可选参数(就作为框架一部分的属性而言),但 C# 3 编译器(这是 Visual Studio 2008 使用的)不支持。 C# 4 中引入了可选参数和命名参数。

我强烈建议您使用现代版本的 Visual Studio,即使您仍需要针对旧版本的 .NET。 (如果可能的话,我也强烈建议移除不受支持的 .NET 版本。)

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 2015-03-18
    • 2012-05-04
    • 1970-01-01
    • 2014-03-25
    • 2010-10-26
    • 2012-10-11
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多