0

C#にはオプションのパラメータなどはないと言われています。ただし、オーバーロード機能を使用して、次のようなデフォルト値で変数を入力することができます。

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

void Person(string name, int age = 30)

私の問題は、VB6のオーバーロードされたメソッドからC#コンポーネントを呼び出すと、名前が「Person(文字列名)、Person _1 (文字列名、整数)」などに変更される傾向があり、デフォルト値の変数をビーイング時に使用できないことです。 「出力」変数。

しかし、どうですか

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

??

誰かがそれがどのように機能するか、そしてそれを使用してVB6のオプションの変数をシミュレートできるかどうかを私に説明できますか?

4

4 に答える 4

5

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次に、引数が1つあり、必要に応じてクラスの値をデフォルトにすることができます。

もちろん、提案されたの使用OptionalAttributeもあなたのために働くはずです。オーバーロードされたメソッドを取り除くか、インターフェイスを使用してこれらのメソッドの1つだけをCOMに公開する必要があると思いますが、次のようになります。

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

于 2011-08-22T12:12:31.297 に答える
3

C#4.0には確かにオプションのパラメーターがあります。

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

}
于 2011-08-22T12:12:00.630 に答える
0

を使って整理しましたOptionalAttribute。他のすべてのソリューションは時間がかかり、包括的であったため、これが最良のソリューションだったと思います。オプションの属性が渡されたかどうかを確認するには、次を使用します: if(attr_optional != Type.Missing)(オプションの属性のタイプが である必要がありますobject)

于 2011-08-26T10:35:44.107 に答える
-2

あなたはこれを行うことができます:

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

ただし、intの代わりに「null」を送信する必要があります。空は機能しません。

于 2011-08-22T12:14:05.520 に答える