2010-04-05 16 views
6

Tôi muốn sử dụng một cái gì đó như thế này:Làm thế nào để thay đổi một loại biến trong C#?

if(x==5) 
{ 
    var mydb= ........ ; 
} 
else 
{ 
    var mydb = ........ ; 
} 

nhưng nó đã không làm việc vì tôi không thể khai báo một biến bên trong câu lệnh if.

Vì vậy, tôi đã cố gắng để làm điều này:

var mydb; 

if (x==5) 
{ 
    mydb= ............. ; 
} 
else 
{ 
    mydb=.............; 
} 

nhưng id không làm việc, hoặc bởi vì tôi đã phải khởi tạo biến (mydb).

Vì vậy, câu hỏi đặt ra là: Tôi không nhất thiết phải biết loại biến, tôi có thể khai báo nó và sau đó thay đổi loại bên trong câu lệnh if?

Trả lời

11

Không, bạn không thể. Các biến không bao giờ thay đổi kiểu của chúng. Bạn thực sự quan tâm đến loại nào? Bạn có thể khai báo biến này thành một kiểu cơ sở chung hay một giao diện mà cả hai đều thực hiện? Nếu bạn có thể cho chúng tôi biết thêm về tình huống của bạn, chúng tôi có thể giúp bạn nhiều hơn.

C# là ngôn ngữ được nhập tĩnh (bỏ qua C# 4; giới thiệu gõ động mà bạn thực sự cần nó, nhưng nó có giá trị hiểu cách "bình thường" C# để làm việc đầu tiên). Trình biên dịch cần phải biết loại biến để nếu có thể tìm ra ý nghĩa của mỗi tham chiếu. Ví dụ, nếu bạn sử dụng

string x = "text"; 
int y = x.Length; 

trình biên dịch cần phải biết rằng x là loại string để nó có thể kiểm tra xem loại có một tài sản Length và phát ra một cuộc gọi đến nó trong IL.

+0

http://msdn.microsoft.com/en-us/library/dd264736%28v=VS.100%29.aspx –

+0

@drorhan: Vâng, nhưng đó là gần như chắc chắn không phải là giải pháp đúng ở đây - Tôi 'd khuyến khích người mới bắt đầu C# để chỉ đạo * tốt * xóa gõ động cho đến khi họ cảm thấy thoải mái với "bình thường" (tĩnh) C#. –

+0

Có thể loại đối tượng của anh ta có thể hữu ích. http://msdn.microsoft.com/en-us/library/9kkx3h3c%28VS.80%29.aspx –

3

C# được nhập tĩnh trừ khi bạn đang chạy 4.0 với dynamic specifier, do đó, việc thay đổi loại này là không thể, ngoại trừ thông qua đa hình.

+2

Các biến được nhập là động vẫn có loại tĩnh: loại động. Không có cách nào để thay đổi loại biến * *. –

1

Bạn có thể khai báo loại cơ sở và kế thừa cả hai loại từ đó. Nhưng câu hỏi chính là: Làm thế nào bạn sẽ sử dụng nó nếu bạn không biết loại của nó?

+0

Đa hình, tất nhiên. –

6

bạn có thể sử dụng:

object mydb = null; 

if(x==5) 
{ 
    mydb= ........ ; 
} 
else 
{ 
    mydb = ........ ; 
} 

nhưng bạn phải Unbox hoặc cast đối tượng trở về kiểu thích hợp của nó khi bạn muốn truy cập của đối tượng lĩnh vực, tài sản, phương pháp này. trừ khi bạn sẽ đợi C# 4 có thể tạo điều kiện cho phương thức động (thuật ngữ chính xác: điều động động?) gọi

+1

Trừ khi bạn đang xử lý một loại giá trị không có hộp nào được tạo nên thuật ngữ "unbox" không phù hợp. Các kiểu giá trị được đặt vào một hộp nếu được sử dụng làm đối tượng để chúng có thể được đặt trên heap (các đối tượng giá trị thông thường chỉ có thể sống trên ngăn xếp). – helium

+2

+1 vì câu trả lời này cho đến nay dường như gần nhất với những gì mà OP yêu cầu. Tuy nhiên, ban đầu bạn có thể phải đặt 'mydb' thành' null' để tránh cảnh báo/lỗi trình biên dịch. – stakx

1

Tôi giả sử rằng bạn có hai loại không tương thích từ hai thư viện khác nhau. Bạn có thể viết một giao diện với các hoạt động phổ biến và viết các bộ điều hợp bọc các lớp đến từ các thư viện và thực hiện giao diện của bạn. Hơn loại biến của bạn mydb có thể là giao diện đó.

Tất nhiên bạn có thể sử dụng object làm loại cho mydb và sử dụng thử nghiệm kiểu động và phôi, nhưng đó sẽ là một quyết định thiết kế rất xấu trong trường hợp này.

0

BẠN CÓ THỂ SỬ DỤNG HỆ THỐNG.CONVERT CLASS NHƯ NÀY HOẶC SỬ DỤNG NĂNG ĐỘNG

string possibleInt = "1234"; 
int count = Convert.ToInt32(possibleInt); 

HOẶC SỬ DỤNG Chuyển đổi Explicit

Trong C#, bạn có thể sử dụng một nhà điều hành dàn diễn viên để thực hiện chuyển đổi rõ ràng. Một diễn viên chỉ định loại để chuyển đổi thành dấu ngoặc tròn. Cú pháp để thực hiện chuyển đổi rõ ràng được hiển thị trong ví dụ mã sau.

DataType variableName1 = (castDataType) variableName2; 
0

Bạn có thể sử dụng như thế này bool result = (condition)? đúng sai ;

var myDB = (x==5) ? true : false ; 
or 
var myDB = x==5 ? "doing something when case is true" : "doing something when case is false" ; 
Các vấn đề liên quan