2013-08-10 12 views
5

Pracuję nad połączeniem C# dll z UDK, w którym trzeba zwrócić niepodpisaną 32-bitową liczbę całkowitą dla wartości bool - stąd 0 jest fałszywe, wszystko większe jest prawdziwy. UDK pobiera wartość i konwertuje go na prawdziwe lub fałszywe ...C# zwracające UInt32 vs Int32 - C# myślenie 0 i 1 to Int32

robiłem jakiś kod i znalazłem to:

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

dał mi błąd:

„Error nie można niejawnie przekonwertować typu „int” do „uint”. wyraźne konwersji istnieje (czy brakuje obsady?)”

Choć rozumiem błąd, zrobił mam ten problem przed wykonaniem

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

Od drogi wygląda jak numerze C# 's ze stringami rzutowania, gdzie jeśli masz to:

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

Pierwszy Console.WriteLine daje błąd, ponieważ C# nie będzie autotypować rzutowania na ciąg znaków

Rozumiem, że istnieją logiczne przyczyny tych błędów (ponieważ występują w tych sytuacjach), ale czy istnieje poprawka dla tego innego niż wykonanie Convert.ToUInt32 (1) i Konwertuj. ToUInt32 (0)?

(mam nadzieję na poprawki zbliżony do tego, jak można przejść 0.f dla pływaków, ale dla niepodpisanych intergers)

+1

Proszę zapoznać się z różnicą między IDE i kompilatorem. Visual Studio nic nie myśli, ponieważ jest to po prostu środowisko programistyczne, które obsługuje kilka różnych języków i kompilatorów. Problem dotyczy programu C# i * nie * Visual Studio. Rozróżnienie jest ważne. –

+0

Przepraszam, tak, rozumiem to. To ja byłem leniwy ... Zmienię to pytanie, by pasowało do –

Odpowiedz

9

Kod poniżej

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

zestawia ponieważ zgodnie C# średnia

13.1.7 Stała wyrażenie (§14.16) typu int można przekształcić do typu sbyte, byte, short, ushort, uint lub ulong, pod warunkiem, że wartość stałej ekspresji jest w zakresie od przeznaczenia rodzaj.

Nie ma niejawna konwersja tak zdefiniowane dla wyrażeń warunkowych, więc pierwszy fragment kodu musi albo wyraźne odlewane lub U przyrostek:

return Console.CapsLock ? 1U : 0; 

Należy pamiętać, że tylko jedna konwersja/przyrostek jest to konieczne, ponieważ zero można przekonwertować na uint w oparciu o zasadę 13.1.7 powyżej.

+2

+1. O wiele bardziej informatywna odpowiedź. –

8

1u jest niepodpisany dosłowne Składnia 1. 0u jest na 0.

Powiązane problemy