我使用转换器将vb更改为c#,其中一行原来是:
Dim roles = System.Web.Security.Roles.GetAllRoles()
Dim roleNames() As String = roles.Where(Function(x) x.ToLower() <> "Admin").ToArray()
当转换返回时,我得到:
dynamic roles = System.Web.Security.Roles.GetAllRoles();
string[] roleNames = roles.Where(x => x.ToLower() != "Admin").ToArray();
然后抛出错误:
不能将lambda表达式用作动态参数 调度操作,而不先将其转发给委托或 表达式树类型。
我尝试了几种不同的方式和一些不同的转换器,但我没有得到任何不同的结果。
如果转换正确,为什么它在vb中工作正常而不在c#中?
答案 0 :(得分:7)
如果转换正确,为什么它在vb中工作正常而不在c#中?
因为转换不正确。你不应该在这里使用dynamic
。
var roles = System.Web.Security.Roles.GetAllRoles();
string[] roleNames = roles.Where(x => x.ToLower() != "Admin").ToArray();
答案 1 :(得分:5)
将dynamic
替换为var
。
正如Servy在他们的comment中指出的那样,因为VB代码是用strict off
编译的,而C#可以避免类型检查的唯一方法是使用dynamic
。由于没有编译时间检查,如果您使用dynamic
编译转换后的代码,很可能会遇到运行时错误。
如果您在转化过程之前转向strict on
,您应该会获得更好的结果,但您可能必须先解决所有产生的错误。
答案 2 :(得分:0)
一种选择是将roles
显式创建为字符串数组:
string[] roles = System.Web.Security.Roles.GetAllRoles();
string[] roleNames = roles.Where(x => x.ToLower() != "Admin").ToArray();