示例#1
0
 public override BoundNode VisitFieldAccess(BoundFieldAccess node)
 {
     BoundExpression receiverOpt = (BoundExpression)this.Visit(node.ReceiverOpt);
     TypeSymbol type = this.VisitType(node.Type);
     var fieldSymbol = ((FieldSymbol)node.FieldSymbol.OriginalDefinition)
         .AsMember((NamedTypeSymbol)this.VisitType(node.FieldSymbol.ContainingType));
     return node.Update(receiverOpt, fieldSymbol, node.ConstantValueOpt, node.ResultKind, type);
 }
示例#2
0
        public override BoundNode VisitFieldAccess(BoundFieldAccess node)
        {
            var field = node.FieldSymbol;
            var receiver = node.ReceiverOpt;

            // if there are any doubts that receiver is a ref type, 
            // assume we will need an address. (that will prevent scheduling of receiver).
            if (!field.IsStatic)
            {
                if (receiver.Type.IsTypeParameter())
                {
                    // type parameters must be boxed to access fields.
                    receiver = VisitExpression(receiver, ExprContext.Box);
                }
                else
                {
                    // need address when assigning to a field and receiver is not a reference
                    //              when accessing a field of a struct unless we only need Value and Value is preferred.
                    if (receiver.Type.IsValueType && (
                            _context == ExprContext.AssignmentTarget ||
                            _context == ExprContext.Address ||
                            CodeGenerator.FieldLoadMustUseRef(receiver)))
                    {
                        receiver = VisitExpression(receiver, ExprContext.Address);
                    }
                    else
                    {
                        receiver = VisitExpression(receiver, ExprContext.Value);
                    }
                }
            }
            else
            {
                // for some reason it could be not null even if field is static...
                //       it seems wrong
                _counter += 1;
                receiver = null;
            }

            return node.Update(receiver, field, node.ConstantValueOpt, node.ResultKind, node.Type);
        }
 public override BoundNode VisitFieldAccess(BoundFieldAccess node)
 {
     BoundExpression receiverOpt = (BoundExpression)this.Visit(node.ReceiverOpt);
     TypeSymbol type = this.VisitType(node.Type);
     var fieldSymbol = ((FieldSymbol)node.FieldSymbol.OriginalDefinition)
         .AsMember((NamedTypeSymbol)this.VisitType(node.FieldSymbol.ContainingType));
     return node.Update(receiverOpt, fieldSymbol, node.ConstantValueOpt, node.ResultKind, type);
 }