【问题标题】:Scripts compiled at runtime fail to invoke method with optional arguments在运行时编译的脚本无法调用带有可选参数的方法
【发布时间】:2012-06-25 04:41:13
【问题描述】:

我们添加了一项功能,供用户编写 C# 脚本以供应用程序执行,这些脚本在运行时编译和运行。这些脚本可以访问我们公开的 API,它们由 CSharpCodeProvider 编译/运行。

我发现运行时编译的代码在调用带有可选参数的方法时会出现问题,例如:

public void BlackmailColonelMustard(int amount, string myAlias, bool tellHisWifeAnyway = true)

如果运行时编译的脚本调用 BlackmailColonelMustard(10000, "Mr Boddy"),编译器会抱怨没有只有两个参数的重载方法,而不是识别第三个参数的默认值.

当从预编译代码调用时,它自然可以正常工作。有谁知道我做错了什么?

是不是因为 VS2010(甚至是 .NET 4 之前的版本)足够聪明,可以编译使用可选参数的代码,但 .NET 3.5 运行时还没有学会这个技巧?

【问题讨论】:

  • 如果您的目标是 .NET 3.5,CSharpCodeProvider 可能使用 C# 3.0 规则,这会阻止使用可选参数。
  • 我想我可能会在使用默认参数时遇到麻烦。如果我们在某个时候实现 IronPython(Python 使用默认参数值)应该足够安全,但我想知道我们是否想要实现另一种不能很好地使用这种方法的 DLR 语言。您的评论可能同意本文:Default Parameters Should Not Be Used

标签: c# .net-3.5 optional-parameters csharpcodeprovider


【解决方案1】:

C# 4.0 中引入了可选参数。如果可能,将编译器版本设置为 4.0:

Dictionary<string, string> options = new Dictionary<string, string>();
options.Add("CompilerVersion", "v4.0");
CSharpCodeProvider provider = new CSharpCodeProvider(options);

【讨论】:

  • 这可能在本地工作,但我认为我不能那样编译它,因为部署目标机器运行.NET 3.5,但不一定是.NET 4.0。我想我只是将简洁的 VS2010 功能与 .NET 功能混淆了。
  • 没有其他解决方案。如果您真的想使用 C# 4.0 功能,那么您需要将部署机器上的框架升级到版本 4(或更高版本)。如果无法升级,恐怕你不得不放弃使用这些功能。
  • @wilee 这不是 VS2010 的功能,而是 C# 4.0 的功能。 .Net 实际上没有可选参数。如果您使用 .Net 4.0 版本的CSharpCodeProvider 编译代码,那应该可以使用 C# 4.0(因为 .Net 4.0 包含 C# 4.0 编译器)。
  • .NET 总是有可选参数,但 C# 编译器从 C# 4.0 起才支持它们。
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 2013-07-03
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多