2010-08-06 31 views
12

Tôi bắt đầu để tận dụng lợi thế của các tham số tùy chọn trong Net 4.0Sử dụng một tham số tùy chọn loại System.Drawing.Color

Vấn đề tôi đang gặp là khi tôi cố gắng để khai báo một tham số tùy chọn của System.Drawing. Màu:

public myObject(int foo, string bar, Color rgb = Color.Transparent) 
{ 
    // .... 
} 

Tôi muốn màu.Trong suốt là giá trị mặc định cho thông số rgb. Vấn đề là, tôi tiếp tục nhận được lỗi biên dịch này:

Default parameter value for 'rgb' must be a compile-time constant

Nó thực sự giết chết gói của tôi nếu tôi chỉ có thể sử dụng các kiểu nguyên thủy cho tham số tùy chọn.

+0

bản sao có thể có của [C# 4.0: Tôi có thể sử dụng một TimeSpan làm tham số tùy chọn với giá trị mặc định không?] (Http://stackoverflow.com/questions/2168798/c-sharp-4- 0-can-i-sử dụng-một-timespan-as-an-optional-tham số-với-một-giá trị mặc định) – nawfal

Trả lời

20

kiểu giá trị Nullable thể được sử dụng để giúp đỡ trong tình huống như thế này.

public class MyObject 
{ 
    public Color Rgb { get; private set; } 

    public MyObject(int foo, string bar, Color? rgb = null) 
    { 
     this.Rgb = rgb ?? Color.Transparent; 
     // .... 
    } 
} 

BTW, lý do này là cần thiết là vì giá trị mặc định được phổ biến tại thời điểm cuộc gọi trong khi biên dịch và static readonly giá trị không được thiết lập cho đến khi thời gian chạy. (Bằng kiểu khởi tạo)

+0

Tôi đã làm điều này mà không cần Visual Studio vì vậy nó có thể cần một số chỉnh nhỏ. –

+0

Ths không hoạt động, Màu không thể rỗng. –

+0

@Neil N, dấu chấm hỏi sau tên loại 'Màu' làm cho cấu trúc đó là' Nullable '. –

3

Tôi không phải là một fan hâm mộ lớn của các thông số tùy chọn cho các trường hợp như thế này cả. IMO trường hợp sử dụng tốt nhất cho các tham số tùy chọn là interop với COM, trong đó các tham số tùy chọn được sử dụng khá một chút. Các tình huống như thế này là một trong những lý do tại sao (tôi đoán) rằng các tham số tùy chọn đã không làm cho nó thành ngôn ngữ cho đến 4.0.

Thay vì tạo ra một tham số tùy chọn, quá tải chức năng như vậy:

public myObject(int foo, string bar) : this (foo, bar, Color.Transparent) {}; 

public myObject(int foo, string bar, Color RGB) { 
... 
} 
+0

đó thực sự là những gì tôi đã có trước đây, nhưng trong trường hợp của tôi, bởi vì có quá nhiều quá tải của các nhà xây dựng , nó chỉ có ý nghĩa hơn khi có một số tham số tùy chọn và giữ một hàm tạo. –

+0

Tôi cho rằng nó không có, và một counterexample tốt là vấn đề bạn đang chạy vào ngay bây giờ. Có khá nhiều chức năng xung quanh các thư viện .NET tiêu chuẩn có * khá * một số tình trạng quá tải. Lấy Convert.ToInt32() cho ví dụ ... Xác định nhiều quá tải cũng mang lại cho bạn khả năng ghi lại cách sử dụng riêng của chúng. Thông thường, một số kết hợp các tham số tùy chọn có ý nghĩa trong khi những thông số khác thì không. Các tham số tùy chọn không cung cấp cho bạn khả năng truyền đạt điều này chỉ bằng cách sử dụng chữ ký của hàm, trong khi quá tải (ở mức độ nào đó). –

+0

Ngoài tham số Màu, mà tôi có thể thay thế bằng một tham số int, tùy chọn đã cho phép tôi xóa khoảng 100 dòng mã dự phòng. Hiện còn ít hơn nhiều để duy trì. –

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