C#中可选(VB)参数的替代方案?

时间:2011-08-22 12:09:30

标签: c# com vb6 com-interop optional-variables

我被告知在C#中没有可选参数这样的东西。 但是您可以使用重载功能并使用默认值输入变量,例如:

void Person(string name, int age)
void Person(string name)

void Person(string name, int age = 30)

我的问题是,当从VB6调用C#组件时,重载方法往往会将名称更改为例如“Person(字符串名称),Person _1 (字符串名称,int age)”等,以及变量当出“变量”变量时,不能使用默认值。

但是怎么样

void Person(string name, [Optional] int age)

...

有人可以向我解释这项工作是如何使用它来模拟VB6中的可选变量吗?

4 个答案:

答案 0 :(得分:6)

从C#4开始,有可选的参数支持:

public void MyMethod(bool arg = false)
{

}

不确定如何从VB6调用它。

另一种可能的方法是将参数包装在另一个类中:

public class PersonSettings
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public Person(PersonSettings settings)
{

}

然后你有一个参数,可以根据需要在PersonSettings类中默认值。

当然,您对OptionalAttribute的使用建议也适用于您。虽然我认为你需要摆脱重载方法,或者使用一个接口只向COM公开其中一个方法:

http://social.msdn.microsoft.com/Forums/en/clr/thread/048c0104-20ed-49af-a221-ddadb081989e

答案 1 :(得分:3)

C#4.0确实有可选参数:

public void MyMethod(string optionalParameter = "optional")
{

}

答案 2 :(得分:0)

我使用OptionalAttribute对此进行了排序。我认为这是最好的解决方案,因为所有其他解决方案都应该耗费时间和全面。 要检查是否已传递可选属性,请使用:if(attr_optional != Type.Missing)(要求可选属性的类型为object

答案 3 :(得分:-3)

你可以这样做:

void Person(string name, int? age)
{
    if (!age.hasValue)
    {
        Console.WriteLine("The nullable integer parameter age wasn't provided with a value ..");
    }
}

但是,您必须发送“null”而不是int。空虚不起作用。