2010-04-21 2 views
6

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

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

+0

Там нет никаких ограничений, чтобы " Типы системы ". Что заставляет вас поверить в это? –

+0

они могут быть другими типами, но единственным доступным значением по умолчанию является null (или, возможно, то, что тип может неявно конвертировать из, но я не могу проверить это, поскольку у меня нет работы 4.0) –

ответ

10

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

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

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

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

Я думал об этих строках, но поскольку я использовал структуру, это тоже не понравилось. Не знаю, почему я не просто сделал func для получения нулевой версии (Size? Size = null). –

+0

System.Nullable ... Теперь я помню, где я получил идею для дополнительного «инициализированного» поля в структуре. :) –

+1

FYI, вы все еще можете использовать оператор с нулевой структурой. –

6

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

using System; 

class Bar { } 

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

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

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

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

+0

«испечь его в сборка ". Люди игнорируют тот факт, что изменение значения по умолчанию параметра в библиотеке не изменит его в клиентском коде, который не был перекомпилирован. –

Смежные вопросы