VB转换为C#

时间:2016-01-21 21:15:56

标签: c# vb.net type-conversion asp.net-roles

我使用转换器将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#中?

3 个答案:

答案 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,您应该会获得更好的结果,但您可能必须先解决所有产生的错误。

有关dynamic关键字的详细信息,请参阅herehere

答案 2 :(得分:0)

一种选择是将roles显式创建为字符串数组:

string[] roles = System.Web.Security.Roles.GetAllRoles();
string[] roleNames = roles.Where(x => x.ToLower() != "Admin").ToArray();