为什么在C#方法参数中为uint参数赋值是无效的?
当为C方法参数中的为什么在C#方法参数中为uint参数赋值是无效的?,c#,visual-studio-2010,C#,Visual Studio 2010,当为C方法参数中的uint参数指定默认值时,如下面的第一个代码块所示,我收到一条消息“类型为'int'的值不能用作默认参数,因为没有到类型'uint'的标准转换”,然而,当在方法体中将int赋值给uint变量时,就可以了 代码不编译;在VisualStudio2010中,警告是通过红色、扭曲的下划线提供的 void GetHistoricData(uint historyLength = 365) { uint i = 365; // this is valid } 使用365U代替
uint
参数指定默认值时,如下面的第一个代码块所示,我收到一条消息“类型为'int'的值不能用作默认参数,因为没有到类型'uint'的标准转换”,然而,当在方法体中将int赋值给uint变量时,就可以了
代码不编译;在VisualStudio2010中,警告是通过红色、扭曲的下划线提供的
void GetHistoricData(uint historyLength = 365)
{
uint i = 365; // this is valid
}
使用365U代替365可以轻松解决这一问题,因此:
void GetHistoricData(uint historyLength = 365U)
{
// method body
}
我发现很难找到一个好的解释来解释为什么在参数中为
uint
指定int
无效,而在其他地方这样做是有效的。有人能帮我找到“灯泡”吗?它为我编译,编译版本为4.0.30319.1和4.0.30319.17379
如果您使用的是旧版本或不同的编译器(例如Mono),那么我怀疑这只是一个bug
编辑:如果它编译得很好(而且我根本无法从编译器中引发警告),那么我怀疑它是某个插件,比如ReSharper。(我也不是在ReSharper中看到的…)
我无法在VS2010中复制这个
我建议您将代码更新为没有警告的代码,只是为了可读性-但它仍然是有效的代码,没有更改。考虑到您正在进行强制转换,因此可能还会截断值,我猜,VisualStudio只会警告您可能发生的潜在问题,并邀请您使用esplicit。特别是当我们谈论默认参数时,应该明确指定默认值。相反,在非esplicit cast的情况下,始终有一个怀疑的空间,关于cast值是什么样子的。红色下划线通常意味着无法编译。VS上的代码分析器有时会出错,产生错误的错误消息和警告,但仍然可以编译。重新启动VS通常可以摆脱它们。这也符合我的要求。我应该提到这一点,所以我会更新这个问题。警告是VS2010中的红色曲线消息,而不是生成错误。这可能是因为可选参数的工作方式,这里实际发生的是将值get注入调用方法,显然,编译器认为在不发出警告的情况下这样做不是一个好主意,毕竟它看起来是一个重新竖琴提示;VS重新启动后,当鼠标移到曲线上方时,R#灯泡开始出现(有时)。红色下划线应表示无法编译。您是否尝试过重新启动VS?我相信这是特定于您的设置的:警告不会在我的代码中显示为“红色、扭曲的下划线”。visual studio重新启动后,当下划线高亮显示时,ReSharper将其灯泡显示在左侧,表明这只是其中一个重竖琴警告。你能用我的答案关闭它吗?你没有回答,只是一句评论。