this в замыкании
От: catbert  
Дата: 26.06.11 10:44
Оценка:
Такой код не компилируется:
  public module Program
  {
      
    Main() : void
    {
        def x = First();
        Console.WriteLine($"$x");
    }
   
    public class Base
    {
        
    }
    
    public class First : Base
    {
      field : Second = Second(this);
    }

    public class Second
    {
      field : First;
      
      internal this(first : First)
      {
          field = first;
      }
    }     
          
  }


Ошибка компилятора:

``this'' or ``base'' usage before base is constructed


Если мы чуть изменим код:
  public module Program
  {
      
    Main() : void
    {
        def x = First();
        Console.WriteLine($"$x");
    }
   
    public class Base
    {
        
    }
    
    public class First : Base
    {
      field : Second = Second(() => this);
    }

    public class Second
    {
      field : First;
      
      internal this(first : void -> First)
      {
          field = first();
      }
    }     
          
  }


Все работает без проблем. Хотя лямбда, по идее, должна вызываться тогда же, когда в первом примере передается this, то есть опять до конструирования базового класса.

В C# аналоги обоих примеров не компилируются:

Keyword 'this' is not available in the current context


В чем тут магия?

На такое поведение компилятора можно полагаться, или это баг, который может быть исправлен?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.