2012-03-15 64 views
8

当在C#方法参数中为uint参数指定默认值时,如下面的第一个代码块所示,我得到消息“一个类型为'int'的值不能用作默认参数,因为存在没有标准的转换来键入'uint'“,而当在方法体中为一个uint变量分配一个int时,它是没问题的。为什么将一个整数值赋给C#方法参数中的一个uint参数是无效的?

该代码确实编译;该警告是由红色的方式提供,在Visual Studio中的波浪下划线2010

void GetHistoricData(uint historyLength = 365) 
{ 
    uint i = 365; // this is valid 
} 

这是很容易解决的,通过代替365使用365U,即:

void GetHistoricData(uint historyLength = 365U) 
{ 
    // method body 
} 

我发现它真的很难找到一个很好的解释,为什么在其他地方有效的时候在参数中指定intuint是无效的。任何人都可以帮我用我想找到的'灯泡'时刻吗?

+1

红色下划线应该表示您无法编译。你有没有尝试重新启动VS? – Tsabo 2012-03-15 11:03:47

+1

我相信这是特定于您的设置:警告不显示在我的代码与“红色,波浪下划线”。 – 2012-03-15 11:05:12

+0

当下划线突出显示时,Visual Studio重新启动引发ReSharper显示其左侧灯泡,表明这只是ReSharper警告中的一个。 – Jason 2012-03-15 11:08:26

回答

1

它为我编译,4.0.30319.1和4.0.30319.17379的编译器版本。

如果您使用的是旧版本或不同的编译器(例如Mono版本),那么我怀疑它只是一个错误。

编辑:如果它编译罚款(我不能招惹的警告从编译器在所有),那么我怀疑它的一些插件,如ReSharper的。 (并不是说我在ReSharper中看到它)

我无法在VS2010中重现此操作。

我会建议你做更新代码到一个没有报警,只是可读性的原因 - 但它仍然是有效代码,而无需改变。

+0

它也符合我的要求。我应该提到,所以我会更新这个问题。该警告是VS2010中的红色波浪线消息,而不是构建错误。 – Jason 2012-03-15 10:57:46

+1

这可能是因为可选参数的工作方式,这里实际发生的是值的注入到调用方法,显然编译器认为这不是一个好主意,做到这一点,而不吐出一个警告 – ntziolis 2012-03-15 11:00:24

+0

它似乎是毕竟一个ReSharper提示;在重新启动VS后,R#灯泡现在开始出现(有时),当波浪线被淹没时。 – Jason 2012-03-15 11:06:05

1

考虑到你正在做一个演员,所以也可能截断的价值,我推测时,Visual Studio仅警告你有关潜在问题的一个事实可能发生,邀请你作出这样的投esplicit 。特别是如果我们正在谈论默认参数,应该明确指定默认值。相反,如果是非隐式投射,总会有疑惑的空间,以及投射值会是什么样子。

1

红色下划线通常意味着您无法编译。 VS上的代码分析器有时会出错,产生错误的错误消息和警告,但仍然可以编译。重新启动VS通常会摆脱它们。

相关问题