2013-08-10 7 views
5

Ich arbeite an einer C# DLL-Bindung an UDK, in dem Sie eine vorzeichenlose 32-Bit-Ganzzahl für Bool-Werte zurückgeben müssen - daher 0 ist falsch, alles größer ist wahr. dies der UDK erhält den Wert und wandelt sie in entweder wahr oder falsch ...C# Rückkehr UInt32 vs Int32 - C# Denken 0 und 1 sind Int32

ich einige Code tat und gefunden:

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

gab mir den Fehler:

„Fehler , kann nicht implizit Typ ‚int‘ auf ‚uint‘. eine explizite Konvertierung vorhanden ist (sind Sie ein gegossenes fehlt?)“

konvertieren Während ich den Fehler verstehen, Ich habe nicht dieses Problem haben, bevor

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

Von der Art und Weise tun es wie C# 's Problem mit String-Schublade gesteckt sieht, wo, wenn Sie dies haben:

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

Der erste Console.WriteLine einen Fehler geben, weil C# wird nicht automatisch in eine Zeichenfolge umgewandelt

Ich verstehe, dass es logische Gründe für diese Fehler gibt (wie sie in diesen Situationen auftreten), aber gibt es eine Lösung für diese außer Convert.ToUInt32 (1) und Convert. ToUInt32 (0)?

(ich bin der Hoffnung, für eine Korrektur ähnlich, wie Sie für Schwimmer gehen 0.f kann, aber für nicht signierte intergers)

+1

Bitte lernen Sie den Unterschied zwischen einer IDE und einem Compiler. Visual Studio denkt nichts, da es sich um eine Entwicklungsumgebung handelt, die mehrere verschiedene Sprachen und Compiler hostet. Das Problem ist mit C# und * nicht * Visual Studio. Die Unterscheidung ist wichtig. –

+0

Entschuldigung, das verstehe ich. Es war ich faul ... Ich werde die Frage ändern, um –

Antwort

9

Der folgende Code

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

kompiliert weil nach C# Standard

13.1.7 Ein konstanter Ausdruck (§14.16) vom Typ intsbyte ist byte, short, ushort, uint oder ulong, sofern der Wert der Konstanten-Ausdruck umgewandelt werden können, um Typ innerhalb des Bereichs des Ziel Art.

Es gibt keine implizite Konvertierung wie die für bedingte Ausdrücke definiert, so dass Ihr erster Codeausschnitt entweder eine explizite Umwandlung oder ein U Suffix benötigt:

return Console.CapsLock ? 1U : 0; 

Beachten Sie, dass nur eine Umwandlung/Suffix erforderlich ist, weil 0 basierend auf der obigen Regel 13.1.7 in uint umgewandelt werden kann.

+2

+1 zu entsprechen. Viel informativere Antwort. –

8

1u ist die unsigned Literalsyntax für 1. 0u ist für 0.

Verwandte Themen