C#返回UInt32与Int32 - C#认为0和1是Int32

5

我正在开发一个将C# dll与UDK绑定的项目,其中需要返回一个无符号32位整数来代表布尔值 - 因此0表示假,任何大于0的值表示真。 UDK获取该值并将其转换为true或false...

我在写代码时发现了这个问题:

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

给我报了如下错误:

"错误,无法隐式将类型'int'转换为'uint'。存在显式转换(是否缺少强制转换?)"

虽然我理解这个错误,但在执行之前并没有出现过这个问题。

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

从外观上看,C#存在字符串类型转换问题,如果您有以下代码:

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

第一条console.writeline会出错,因为C#不会自动将其转换为字符串

我知道这些错误之所以发生是有逻辑原因的(因为它们发生在这些情况下),但是否有其他解决方法,而不是使用Convert.ToUInt32(1)和Convert.ToUInt32(0)?

(我希望有一种类似于浮点数中的0.f的修复方式,但适用于无符号整数)


1
请了解IDE和编译器之间的区别。Visual Studio并不是什么都不做,它只是一个托管多种语言和编译器的开发环境。问题出在C#上,而不是Visual Studio上。这个区别很重要。 - Ken White
抱歉,是的,我明白了。那是因为我太懒了...我会修改问题以匹配。 - Gareth Jones
2个回答

9
下面的代码
if (File.Exists(filepath))
    return 1;
else
    return 0;

根据C#标准,编译是因为:

13.1.7 类型为int的常量表达式(§14.16)可以转换为类型sbytebyteshortushortuintulong,前提是常量表达式的值在目标类型的范围内。

与条件表达式定义的隐式转换不同,因此您的第一个代码片段需要显式转换或使用U后缀:

return Console.CapsLock ? 1U : 0;

请注意,只需要进行一次转换/后缀操作,因为根据规则13.1.7,零可以被转换为uint

8

1u是表示无符号整数1的字面量语法。0u则表示0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接