IIf函数的奇怪问题,呵呵,大伙看看

hztltgg 2008-11-14 11:20:19
vb里
Sub Main(ByVal args As String())

Console.WriteLine(IIf(args.Length > 0, args(0), ""))

End Sub
出错,原因是iif的函数里的表达式都会计算一次先,由于args是空,arsg(0)下标越界了,用if语句和一个变量分别来写可以。

c#里用三目运算符可以,不会出错
static void Main(string[] args)
{
Console.WriteLine(args.Length > 0 ? args[0] : "");

}

这么会这样捏,奇怪的问题,msdn里可是说IIf 函数提供相当于 Visual C++ 中的三元 Conditional Operator: ? : 的功能。
...全文
197 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinhl99 2008-11-14
  • 打赏
  • 举报
回复
vb里args可以是空的,你需要判断下 If args.Length <= 0
而c#里args[0]一定是有值的!
全速前行 2008-11-14
  • 打赏
  • 举报
回复
up
hztltgg 2008-11-14
  • 打赏
  • 举报
回复
不是第一个参数有问题,是第二个参数args(0)有问题,如果args是个空数组,args(0)是不能访问的,越界了
华芸智森 2008-11-14
  • 打赏
  • 举报
回复
Sub Main(ByVal args As String())

Console.WriteLine(IIf(("" & args).Length > 0, args(0), ""))

End Sub
华芸智森 2008-11-14
  • 打赏
  • 举报
回复
Sub Main(ByVal args As String())

Console.WriteLine(IIf(len(args) > 0, args(0), ""))

End Sub
hztltgg 2008-11-14
  • 打赏
  • 举报
回复
是这个么?
Public Function IIf(Of T)(ByVal Expression As Boolean, _
ByVal TruePart As T, ByVal FalsePart As T) As T
If Expression Then
Return TruePart
Else
Return FalsePart
End If
End Function

一样的吧,args(0)作为参数肯定要先运算的,越界了,这儿关键还不是空引用的问题
康斯坦汀 2008-11-14
  • 打赏
  • 举报
回复
下面这篇文章说的是你这个问题,还提供了一个替代函数,哈哈:

http://samuraiprogrammer.com/community/blogs/greg/archive/2007/06/22/IIF-in-VB.net-vs.-_3F00_-_3A00_-in-C_2300_.aspx


yanlongwuhui 2008-11-14
  • 打赏
  • 举报
回复
先判断args是否为nothing
PrinSun 2008-11-14
  • 打赏
  • 举报
回复
兄弟放弃吧!没有别的解决方法的!~
除非不用IIF
hztltgg 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yangmt204 的回复:]
IIf(args isnot nothing andalso args.Length > 0, args(0), ""))
[/Quote]
不行的,这只是判断args是否为空,问题是出在第二个参数args(0)上
hztltgg 2008-11-14
  • 打赏
  • 举报
回复
楼上试过没?我试了可是错的哦,索引超出了数组界限。

()在前在后一样的吧,以前的语法在变量后,现在用oop的观点看,放在变量类型后面更好理解


看来还是用IF THEN 吧,我就是想看看能不能让代码少几行。
yangmt204 2008-11-14
  • 打赏
  • 举报
回复
IIf(args isnot nothing andalso args.Length > 0, args(0), ""))
yangmt204 2008-11-14
  • 打赏
  • 举报
回复
IIf(args not nothing andalso args.Length > 0, args(0), ""))
qinhl99 2008-11-14
  • 打赏
  • 举报
回复
知道了,是你Sub Main(ByVal args As String()) 中 数组定义错了
vb里
Sub Main(ByVal args() As String)

Console.WriteLine(IIf(args.Length > 0, args(0), ""))

End Sub
就对了!!
华芸智森 2008-11-14
  • 打赏
  • 举报
回复
IIF是这样的.它不支持短路计算.
转为IF THEN 算了嘛.
qinhl99 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qinhl99 的回复:]
vb里args可以是空的,你需要判断下 If args.Length <= 0
而c#里args[0]一定是有值的!//抱歉,我说的不对,记错了!
[/Quote]

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧