不可调用的成员 'xyz' 不能像方法一样使用, vb 和 c# 的区别



我在VB中有这段代码:

Private mTemmpEmpTimesheetDeclareDetails As IEnumerable(Of 
EmpTimesheetDeclareDetail) = Nothing
If mTemmpEmpTimesheetDeclareDetails.Count > 0 Then
mEmpTimesheetDeclareDetail = mTemmpEmpTimesheetDeclareDetails(0)
End If

现在我已经在 c# 中转换了相同的代码段:

private IEnumerable<EmpTimesheetDeclareDetail> mTemmpEmpTimesheetDeclareDetails = null;
if (mTemmpEmpTimesheetDeclareDetails.Count() > 0)
{
  mEmpTimesheetDeclareDetail = (EmpTimesheetDeclareDetail)mTemmpEmpTimesheetDeclareDetails(0);
}

它在这里给了我错误(EmpTimesheetDeclareDetail)mTemmpEmpTimesheetDeclareDetails(0)不可调用的成员不能像方法一样使用。虽然我知道我使用mTemmpEmpTimesheetDeclareDetails作为不正确的方法的错误。但是它如何在 VB 中接受它呢?如何在 C# 中实现这一点?

您已将您的成员声明为IEnumerable<T>IEnumerable<T>不支持索引,因为它是一系列值。你正在寻找ElementAt().因此,您的代码将变为:

mEmpTimesheetDeclareDetail = mTemmpEmpTimesheetDeclareDetails.ElementAt(0);

请注意,您不需要强制转换结果,因为 ElementOf() 的结果将与 T 相同(在这种情况下,由于您是 IEnumerable<EmpTimesheetDeclareDetail> ,结果将是 EmpTimesheetDeclareDetail )。

此外,您还可以整理其他一些事项:

使用.Any()而不是Count() > 0。根据序列的来源,这可以阻止整个序列被具体化,它只会具体化第一项以检查序列是否不为空。

此外,还存在比ElementAt(0)更清晰的FirstFirstOrDefault()。如果没有元素,前者将引发异常,后者将在您的情况下返回null。但是,由于您已经检查了元素,因此First()更适合这里。

mTemmpEmpTimesheetDeclareDetails(0)应该mTemmpEmpTimesheetDeclareDetails.ElementAt(0)

c#索引应该通过一对方括号访问 [] . 这里括号用于调用方法。因此,当您使用 mTemmpEmpTimesheetDeclareDetails(0) 时,编译器假定您正在使用整数参数调用名为 mTemmpEmpTimesheetDeclareDetails 的方法。

但是在您的情况下,您正在基于其索引访问IEnumerable<T>,因此您必须使用方法.ElementAt(index),因为Enumerable更通用,并且由enumerable表示的集合可能没有索引器

相关内容

最新更新