2016-01-21 4 views
2

Я использовал конвертер, чтобы изменить VB на C# и одной из линий изначально является: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(); 

Который затем бросает ошибка:

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.

Я попробовал несколько различных способов и несколько различных преобразователей, но я не получаю никаких разные результаты.

Почему это нормально работает в vb, а не в C#, если преобразование верное?

+0

Позднее связывание с C# (с помощью 'dynamic') не может подобрать по методам расширения. Попробуйте изменить 'dynamic' на' var' и посмотреть, что произойдет. – willaien

+0

@willaien На самом деле это не удается при попытке использовать лямбда, прежде чем она даже попытается решить метод расширения. – Servy

+0

Это простое решение. Вы знаете в vb, что Dim, я бы предположил так, как это объявлено в C# ... Я бы волновался об изучении синтаксиса вместо преобразования кода ... – Codexer

ответ

5

Заменить dynamic на var.

Как указывает Servy в их comment, это происходит из-за того, что код VB скомпилирован с strict off и единственным способом, с помощью которого C# можно избежать проверки типа, является dynamic. Поскольку проверка времени компиляции не производится, вы должны получить преобразованный код для компиляции с помощью dynamic, есть хорошая вероятность, что вы столкнетесь с ошибками времени выполнения.

Если вы закончите процесс преобразования strict on, вы должны получить лучшие результаты, но вам, вероятно, придется исправить все ошибки, которые возникают в первую очередь.

Для получения дополнительной информации о dynamic ключевом слове см here и here

+0

Это делает ошибку, потому что код VB скомпилирован строго, и практически во всех случаях единственным способом репликации в C# является 'dynamic'. Хуже того, конверсии редко будут компилироваться (а именно, когда задействованы лямбда и методы расширения). – Servy

7

Why does it work fine in vb and not in c# if the conversion is correct?

Поскольку преобразование не является правильным. Вы не должны использовать dynamic здесь.

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

Одним из вариантов является явно создать roles как массив строк:

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