Необязательные параметры несистемного типа - PullRequest
6 голосов
/ 21 апреля 2010

C # 4.0 приносит дополнительные параметры, которые я ждал довольно давно. Однако кажется, что, поскольку только системные типы могут быть const, я не могу использовать любой класс / структуру, которые я создал, как необязательный параметр.

Есть ли какой-то способ, который позволяет мне использовать более сложный тип в качестве необязательного параметра. Или это одна из реалий, с которой нужно просто жить?

Ответы [ 2 ]

10 голосов
/ 21 апреля 2010

Лучшее, что я мог придумать для справочных типов:

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));
    }
}

Вы можете использовать ту же идею для структур, сделав параметр обнуляемым:

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);
}
6 голосов
/ 21 апреля 2010

Вы можете использовать любой тип в качестве необязательного параметра:

using System;

class Bar { }

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

Хорошо, я перечитал ваш вопрос и думаю, что понимаю, что вы имеете в виду - вы хотите иметь возможность сделать что-то вроде этого:

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

К сожалению, это недопустимо, поскольку значение параметра по умолчанию должно быть известно во время компиляции, чтобы компилятор мог запечь его в сборке.

...