6

C#4.0 では、私がかなり長い間待ち望んでいたオプションのパラメーターが導入されました。ただし、 System 型のみが になる可能性があるためconst、作成したクラス/構造体をオプションのパラメーターとして使用できないようです。

より複雑な型をオプションのパラメーターとして使用できるようにする方法はありますか。それとも、これはただ生きなければならない現実の1つですか?

4

2 に答える 2

9

参照型について思いついたのは次のとおりです。

using System;

public class Gizmo
{
    public int Foo { set; get; }
    public double Bar { set; get; }

    public Gizmo(int f, double b)
    {
        Foo = f;
        Bar = b;
    }
}

class Demo
{
    static void ShowGizmo(Gizmo g = null)
    {
        Gizmo gg = g ?? new Gizmo(12, 34.56);
        Console.WriteLine("Gizmo: Foo = {0}; Bar = {1}", gg.Foo, gg.Bar);
    }

    public static void Main()
    {
        ShowGizmo();
        ShowGizmo(new Gizmo(7, 8.90));
    }
}

パラメーターを null 可能にすることで、同じ考え方を構造体に使用できます。

public struct Whatsit
{
    public int Foo { set; get; }
    public double Bar { set; get; }

    public Whatsit(int f, double b) : this()
    {
        Foo = f; Bar = b;
    }
}

static void ShowWhatsit(Whatsit? s = null)
{
    Whatsit ss = s ?? new Whatsit(1, 2.3);
    Console.WriteLine("Whatsit: Foo = {0}; Bar = {1}",
        ss.Foo, ss.Bar);
}
于 2010-04-21T01:18:41.460 に答える
5

オプションのパラメーターとして任意の型を使用できます。

using System;

class Bar { }

class Program
{
    static void Main()
    {
        foo();
    }
    static void foo(Bar bar = null) { }
}

わかりました、私はあなたの質問を読み直しました。あなたの言いたいことがわかると思います-あなたは次のようなことができるようになりたいと思っています:

static void foo(Bar bar = new Bar()) { }

残念ながら、これは許可されていません。これは、既定のパラメーターの値をコンパイル時に認識して、コンパイラがそれをアセンブリに焼き込めるようにする必要があるためです。

于 2010-04-21T01:02:59.163 に答える