2013-08-10 32 views
5

Tôi đang làm việc trên một dll C# liên kết với UDK, trong đó bạn phải trả về một số nguyên 32 bit không dấu cho các giá trị bool - do đó 0 là false, là đúng. Các UDK được giá trị và chuyển đổi nó hoặc là đúng hay sai ...C# trả về UInt32 so với Int32 - C# suy nghĩ 0 và 1 là Int32

tôi đang làm một số mã và thấy điều này:

[DllExport("CheckCaps", CallingConvention = CallingConvention.StdCall)] 
    public static UInt32 CheckCaps() 
    { 
     return (Console.CapsLock ? 1 : 0); 
    } 

đã cho tôi lỗi của:

"Lỗi , Không thể chuyển đổi rõ ràng loại 'int' thành 'uint'. Hiện có một chuyển đổi rõ ràng là (bạn có thiếu một diễn viên không?) "

Trong khi tôi hiểu lỗi, Tôi didnt có vấn đề này trước khi làm

  if (File.Exists(filepath)) 
      return 1; 
     else 
      return 0; 

Từ hình thức của nó giống như vấn đề với chuỗi typecasting C# 's, mà nếu bạn có điều này:

int example = 5; 
Console.Writeline(example); 
Console.Writeline(example + ""); 

Các Console.WriteLine đầu tiên sẽ đưa ra một lỗi vì C# sẽ không tự đúc thành một chuỗi

Tôi hiểu rằng có những lý do logic đằng sau các lỗi này (khi chúng xảy ra trong các trường hợp này), nhưng có sự khắc phục cho điều này ngoài thực hiện Convert.ToUInt32 (1) và Chuyển đổi. ToUInt32 (0)?

(Tôi hy vọng cho một sửa chữa tương tự như cách bạn có thể đi 0.f cho nổi, nhưng đối với intergers unsigned)

+1

Hãy tìm hiểu sự khác biệt giữa IDE và trình biên dịch. Visual Studio nghĩ không có gì, vì nó chỉ đơn giản là một môi trường phát triển lưu trữ nhiều ngôn ngữ và trình biên dịch khác nhau. Vấn đề là với C#, và * không * Visual Studio. Sự khác biệt là quan trọng. –

+0

Xin lỗi, tôi hiểu điều đó. Đó là tôi lười biếng ... Tôi sẽ thay đổi câu hỏi để phù hợp với –

Trả lời

9

mã dưới đây

if (File.Exists(filepath)) 
    return 1; 
else 
    return 0; 

biên dịch vì theo tiêu chuẩn C#

13.1.7 A-biểu thức hằng số (§14.16) kiểu int có thể được chuyển đổi sang loại sbyte, byte, short, ushort, uint, hoặc ulong, với điều kiện giá trị của hằng số thể hiện nằm trong phạm vi của các điểm đến kiểu.

Không có chuyển đổi ngầm như thế được xác định cho các biểu thức có điều kiện, vì vậy đoạn mã đầu tiên bạn cần hoặc là một diễn viên rõ ràng hoặc một U hậu tố:

return Console.CapsLock ? 1U : 0; 

Lưu ý rằng chỉ có một chuyển đổi/hậu tố là cần thiết, bởi vì số không có thể được chuyển đổi thành uint dựa trên quy tắc 13.1.7 ở trên.

+2

+1. Nhiều câu trả lời nhiều thông tin hơn. –

8

1u là cú pháp đen unsigned cho 1. 0u là 0.

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