2010-04-21 45 views
6

C# 4.0 mang đến các tham số tùy chọn mà tôi đã đợi trong một thời gian. Tuy nhiên có vẻ như là bởi vì chỉ có các kiểu Hệ thống có thể là const, tôi không thể sử dụng bất kỳ lớp/cấu trúc nào mà tôi đã tạo làm tham số tùy chọn.Các tham số kiểu không thuộc hệ thống tùy chọn

Có cách nào cho phép tôi sử dụng loại phức tạp hơn làm thông số tùy chọn hay không. Hay đây là một trong những thực tế mà người ta phải sống cùng?

+0

Không có giới hạn như " Loại hệ thống ". Điều gì khiến bạn tin điều đó? –

+0

chúng có thể là các loại khác, nhưng giá trị mặc định duy nhất có sẵn là null (hoặc có thể một cái gì đó mà loại có thể chuyển đổi hoàn toàn từ nhưng tôi không thể kiểm tra điều này vì tôi không có 4.0 tại nơi làm việc)) –

Trả lời

10

Điều tốt nhất tôi có thể đưa ra đối với các loại tài liệu tham khảo là:

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

Bạn có thể sử dụng ý tưởng tương tự cho cấu trúc bằng cách làm cho các tham số 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

Tôi đã suy nghĩ theo những dòng đó, nhưng khi tôi đang sử dụng một cấu trúc, nó cũng không giống như vậy. Không biết tại sao tôi không chỉ làm cho func có một phiên bản nullable (Size? Size = null) mặc dù. –

+0

System.Nullable ... Bây giờ tôi nhớ nơi tôi có ý tưởng cho một trường "được khởi tạo" bổ sung trong cấu trúc. :) –

+1

FYI, bạn vẫn có thể sử dụng ?? toán tử có cấu trúc nullable. –

6

Bạn có thể sử dụng bất kỳ kiểu như là một tham số tùy chọn:

using System; 

class Bar { } 

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

Được rồi, tôi đọc lại câu hỏi của bạn và tôi nghĩ rằng tôi nhìn thấy những gì bạn có nghĩa là - bạn muốn để có thể làm điều gì đó như thế này:

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

Thật không may điều này là không được phép vì giá trị của tham số mặc định phải được biết tại thời gian biên dịch để trình biên dịch có thể nướng nó vào trong assembly.

+0

assembly "- Mọi người bỏ qua thực tế là việc thay đổi giá trị mặc định của một tham số trong một thư viện sẽ không thay đổi nó trong mã máy khách chưa được biên dịch lại. –

Các vấn đề liên quan