9

我很想知道 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 方法?

4

2 回答 2

10

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

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

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

你这样称呼它:

Foo(15);

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

Foo(15, 20);

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

于 2010-07-13T20:14:18.997 回答
9

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

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

有关详细信息,请参阅此处

于 2010-07-13T20:14:25.680 回答