2012-11-08 37 views
15

tôi có int biến với giá trị 820924 khi tôi đang cố gắng để chuyển đổi nó như thế:làm thế nào để chuyển đổi int để UINT

(uint)data[structure["MICROSECONDS"].Index]

nó không hoạt động

này không hoạt động tốt

unchecked((uint)data[structure["MICROSECONDS"].Index])

Tôi nhận được "Truyền được chỉ định không hợp lệ". ngoại lệ.

lưu trữ dữ liệu object nhưng khi chạy, tôi nên cố gắng chuyển đổi int. Tôi gần như chắc chắn. Tôi đã in giá trị đối tượng nó là 820924, tuy nhiên tôi không biết làm thế nào để in loại đối tượng, nhưng nó phải là int.

Code:

object value = data[structure["MICROSECONDS"].Index]; 
Console.WriteLine("xx MICROSECONDS type " + value.GetType()); 
Console.WriteLine("xx casting " + value); 
Console.WriteLine("xx cast ok" + (uint)value); 

Kết quả:

xx MICROSECONDS type System.Int32 
xx casting 820924 
+2

'var i = (uint) 820.924; 'công trình. Có thể là 'Index' của bạn trả về một chuỗi? –

+0

@ L.B nó không nên như vậy nhưng tôi không biết làm thế nào để kiểm tra này tại thời gian chạy – javapowered

+0

thử 'Convert.ToUInt32' –

Trả lời

31

Trước hết bạn nên kiểm tra các loại giá trị của bạn. Bạn có thể làm điều đó bằng cách gọi phương thức obj.GetType() (hoặc trong mã của bạn trực tiếp hoặc trong cửa sổ ngay lập tức).

Nếu đó là int sau đó bạn có thể làm:

uint u = (uint) (int) obj; 

Xin lưu ý rằng nó khác với dàn diễn viên của bạn bởi vì nó phôi để int và sau đó chuyển đổi để uint trong khi bạn đang cố gắng để đúc đến uint. int không thể truyền tới uint và đó là lý do bạn nhận được InvalidCastException. int chỉ có thể được chuyển đổi thành uint. Điều gây nhầm lẫn là cả hai số chuyển đổibỏ các toán tử trông giống nhau trong mã: u = (uint) x.

điều dễ dàng hơn bạn có thể làm là gọi một phương pháp cụ thể từ các Convert lớp:

uint u = Convert.ToUInt32(x); 
0

Có thể là các Index bất động sản đang trở lại một chuỗi hoặc một cái gì đó. Bạn có thể làm như sau:

var num = Convert.ToUInt32(data[structure["MICROSECONDS"].Index]); 

Convert.ToUInt32 bị quá tải với tất cả các loại có liên quan mà một uint thể được chuyển đổi từ.

1

Nếu Index là một chuỗi, hoặc có một số giống như đại diện khi chuyển thành một chuỗi bạn có thể thử:

UInt32 microSecondsIndex; 
if(Uint32.TryParse(data[structure["MICROSECONDS"].Index.ToString()],out microSecondsIndex)) 
{ 
    //Do Stuff 
} 
else 
{ 
    //Do error handling 
} 
+0

@Snowbear Nó có thể là một chuỗi, đã thấy lưu trữ dữ liệu weirder, nhưng lưu ý, đã chỉnh sửa để phản ánh ràng buộc trên TryParse – user1793607

+0

Tôi có nghĩa là nó rõ ràng không phải là một chuỗi vì nếu nó sẽ là một chuỗi (tại thời gian biên dịch) sau đó chuyển nó thành 'uint' sẽ không biên dịch. Nhưng câu hỏi nói rằng nó có thể được biên dịch, có nghĩa là nó là một 'đối tượng'. Và 'đối tượng' không thể được truyền trực tiếp đến' TryParse' – Snowbear

2

Vấn đề là int được lưu giữ như object.Int có nguồn gốc từ đối tượng nhưng uint không xuất phát từ int để bạn không thể truyền int được lưu trữ dưới dạng object đến uint. Trước tiên, bạn phải truyền nó đến int và sau đó đến uint vì tính năng truyền đó hợp lệ. Thử nó cho mình:

object o = 5;//this is constant that represents int, constant for uint would be 5u 
uint i = (uint)o;//throws exception 

Nhưng công trình này:

object o = 5; 
int i = (int)o; 
uint j = (uint)i; 

hoặc

object o = 5; 
uint i = (uint)(int)o; //No matter how this looks awkward 
Các vấn đề liên quan