Как описано здесь , в C # используются классы, подобные следующим:
public class Node {
public NodeData Data { get; set; } = new NodeData();
public List<Node> Children { get; set; } = new List<Node>() { null };
}
public class NodeData {
public string Name { get; set; }
}
возможно генерировать деревья выражений (используя компилятор), которые имеют экземпляр
MemberMemberBinding :
Expression<Func<Node>> expr = () => new Node() {
Data = {
Name = "hello world"
}
};
или MemberListBinding :
Expression<Func<Node>> expr1 = () => new Node() {
Children = {
new Node(), new Node()
}
};
При попытке сделать то же самое в VB.NET код не компилируется; ни код MemberMemberBinding , ни код ListBinding :
Class Node
Property Data As NodeData = New NodeData
Property Children As List(Of Node) = New List(Of Node)
End Class
Class NodeData
Property Name As String
End Class
' Compiler error -- Expression cannot be converted to expression tree
' When assigning to Func(Of Node) instead of Expression -- Name is not a member of Node
Dim expr As Expression(Of Func(Of Node)) = Function() New Node With {
.Data = {
.Name = "abcd"
}
}
' Compiler error -- value of type Node() cannot be converted to List(Of Node)
Dim expr1 As Expression(Of Func(Of Node)) = Function() New Node With {
.Children = {
New Node, New Node
}
}
Есть ли способ заставить компилятор VB.NET генерировать MemberMemberBinding и MemberListBinding экземпляров?