【问题标题】:Is the Optional Parameter in C# 4 Backwards Compatible?C# 4 中的可选参数是否向后兼容?
【发布时间】:2010-07-13 20:11:00
【问题描述】:

我很想知道C#4中引入的可选参数是否向后兼容?

让我用一个简单的例子来澄清我的问题。假设我在 VS2010 的 .Net2 上用 C#4 编写以下代码:

public void Foo(int val1, int val2, int val3 = 5){ .... }

现在我编译了代码,制作了一个 dll 并将其引用到 .Net2 上的 C#2 / C#3 项目。在代码编辑器中(除了 VS2010,比如 VS2008)我会在智能感知中看到什么?

  1. 两个重载方法,如:

    public void Foo(int val1, int val2)
    public void Foo(int val1, int val2, int val3)
    
  2. 类似的东西:

    public void Foo(int val1, int val2, int val3)
    public void Foo(int val1, int val2, int val3 = 5) //VS2008 is not supposed to show this
    

我应该如何在 C#2 项目中调用 C#4 方法?

【问题讨论】:

    标签: c# .net visual-studio-2008 visual-studio-2010 optional-parameters


    【解决方案1】:

    这只是一种方法——C# 编译器不会创建重载。就好像您正在使用可选参数调用在 VB.NET 中创建的方法 - 它们从一开始就在 .NET 中。只是 C# 2 编译器不知道如何处理它们,所以你必须自己指定所有参数。

    基本上可选参数只会改变方法的调用方式。如果有这样的方法:

    public void Foo(int x = 10, int y = 20)
    

    你这样称呼它:

    Foo(15);
    

    C# 4 编译器会将 调用 端更改为:

    Foo(15, 20);
    

    C# 2 编译器无法做到这一点,因此您必须指定两个参数。

    【讨论】:

    • 非常感谢。它澄清了我的问题。谢谢。
    【解决方案2】:

    您将看到一个包含所有参数的方法。

    在 C# 4 和每个版本的 VB 中带有可选参数的方法都被编译为单个方法,其中 CIL 元数据指示哪些参数是可选的以及它们的默认值是什么。
    C# 3(编译器和 Visual Studio 的 IntelliSense)忽略此元数据。

    有关详细信息,请参阅here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多