testsuite/positive/generic-nongeneric.n
От: _nn_ www.nemerleweb.com
Дата: 22.04.10 09:59
Оценка:
В тесте присутствует такой код:

namespace SystemActionVsAction {
  using System;
  
  public variant Action {
    | B
    | C
  }
  
  public module M {
    public foo (x : Action) : void {
      _ = x is Action.B
    }
  }
}

Как он вообще проходит ??

Возьмем другой пример без System
namespace A
{
  class X {}
}

namespace B
{
  using A;
  
  variant X
  {
    | Q
    | W
  }
  
  public module M
  {
    public F(x : X) : void
    {      
    }
  }
}

Error: type name 'X' is ambiguous, it could be:

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: testsuite/positive/generic-nongeneric.n
От: _nn_ www.nemerleweb.com
Дата: 22.04.10 10:03
Оценка:
Здравствуйте, _nn_, Вы писали:

Опечатка
namespace A
{
  class X[T] {}
}

namespace B
{
  using A;
  
  variant X
  {
    | Q
    | W
  }
  
  public module M
  {
    public F(x : X) : void
    {      
    }
  }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: testsuite/positive/generic-nongeneric.n
От: hardcase Пират http://nemerle.org
Дата: 22.04.10 10:32
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, _nn_, Вы писали:


__>Опечатка

__>
__>namespace A
__>{
__>  class X[T] {}
__>}

__>namespace B
__>{
__>  using A;
  
__>  variant X
__>  {
__>    | Q
__>    | W
__>  }
  
__>  public module M
__>  {
__>    public F(x : X) : void
__>    {      
__>    }
__>  }
__>}
__>


Вообще логично что он не может найти, только сообщение должно быть иным:
1) A.X[T] не подходит так как нужна не-параметричесеска
2) B.X не подходит так как область видимости (public) метода M.F шире области видимости параметра x типа X (internal).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: testsuite/positive/generic-nongeneric.n
От: _nn_ www.nemerleweb.com
Дата: 22.04.10 10:57
Оценка:
Здравствуйте, hardcase, Вы писали:

У меня тут ошибка.
Это я пробовал собрать компилятор для .Net 4.0, видимо повлияло как-то на компилятор.

В общем тут ошибка правильная

c:\Projects\test\WebApplication3\Class2.n(37,5):Error: Method 'F' is more accessible than 'B.X'


А вот это не компилируется
namespace SystemActionVsAction {
  using System;
  
  public variant Action {
    | B
    | C
  }
  
  public module M {
    public foo (x : Action) : void {
      _ = x is Action.B
    }
  }
}


Или модификация без System:
namespace A
{
  public delegate X() : void;
}

namespace B
{
  using A;
  
  public variant X
  {
    | Q
    | W
  }
  
  public module M
  {
    public F(x : X) : void
    {      
    }
  }
}


Если изменить на
public delegate X[T]() : void
то компилируется.

Остается неясным как компилятор проходит тест.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: testsuite/positive/generic-nongeneric.n
От: hardcase Пират http://nemerle.org
Дата: 22.04.10 11:01
Оценка:
Здравствуйте, _nn_, Вы писали:


__>Если изменить на

__>public delegate X[T]() : void
__>то компилируется.

__>Остается неясным как компилятор проходит тест.



В том и суть — компилятор между генериком и не-генериком предпочет не-генерик.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: testsuite/positive/generic-nongeneric.n
От: _nn_ www.nemerleweb.com
Дата: 22.04.10 11:10
Оценка: 48 (1)
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, _nn_, Вы писали:



__>>Если изменить на

__>>public delegate X[T]() : void
__>>то компилируется.

__>>Остается неясным как компилятор проходит тест.



H>В том и суть — компилятор между генериком и не-генериком предпочет не-генерик.


Посмотрите на тест generic-nongeneric.
Как компилятор выбирает между public variant Action и System.Action (есть несколько определений и одно из них не(!) генерик)

А я знаю как !
Если нет в референсах System.Core то компиляция проходит.
Потому что в System определение идет следующее:
public delegate void Action<T>(T obj)


А в System.Core:
public delegate void Action()
public delegate void Action<T1, T2>(T1 arg1, T2 arg2)
public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3)
public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)


И поэтому не компилируется.

Почему это вообще создало проблему ?

Дело в том что в .Net 4.0 нет этих странностей и все Action-ы идут в mscorlib.dll.
И тогда тест падает при компиляции с .Net 4.0.

В общем нужно подправить тест, чтобы не дергал System.Action вообще.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: testsuite/positive/generic-nongeneric.n
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.10 14:26
Оценка:
Здравствуйте, _nn_, Вы писали:

__>В тесте присутствует такой код:


__>
__>namespace SystemActionVsAction {
__>  using System;
  
__>  public variant Action {
__>    | B
__>    | C
__>  }
  
__>  public module M {
__>    public foo (x : Action) : void {
__>      _ = x is Action.B
__>    }
__>  }
__>}          
__>

__>Как он вообще проходит ??

Дык а что не так то?

Члена B в System.Action нет. Так что без проблем выведется SystemActionVsAction.Action.B.

Это еще что. У меня сейчас в программе есть вот такой код:
def metadataFilePath = Path.Combine(Path, $"02346621_$(Year)_-_$(Num)_unicode.xml");

Здесь первый Path — это System.IO.Path, а второй — локальное свойство (строка). И ничего! Все пашет как часы. Даже комплит работает совершенно корректно.

Разрешение перегрузок, однако!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: testsuite/positive/generic-nongeneric.n
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.10 14:31
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, _nn_, Вы писали:


__>Опечатка

__>
__>namespace A
__>{
__>  class X[T] {}
__>}
__>


Так все работает. Только public-и нужно поставить у типов.

А в прошлом примере имела место классическая неоднозначность.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: testsuite/positive/generic-nongeneric.n
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.10 14:40
Оценка:
Здравствуйте, _nn_, Вы писали:

А зачем ты стал этот тест править?
Он ведь отлично работал.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: testsuite/positive/generic-nongeneric.n
От: _nn_ www.nemerleweb.com
Дата: 22.04.10 17:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _nn_, Вы писали:


VD>А зачем ты стал этот тест править?

VD>Он ведь отлично работал.

Для .Net 4.0.
Да вот здесь
Автор: _nn_
Дата: 22.04.10
все описано.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: testsuite/positive/generic-nongeneric.n
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.10 19:42
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Для .Net 4.0.

__>Да вот здесь
Автор: _nn_
Дата: 22.04.10
все описано.


Ясно. В МС как всегда много оригиналов. Обратной совместимости предпочитают более логичный дизайн.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: testsuite/positive/generic-nongeneric.n
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.10 19:45
Оценка:
Здравствуйте, _nn_, Вы писали:

__>В общем нужно подправить тест, чтобы не дергал System.Action вообще.


Ага. Но этот тест раньше, как не странно, проверял возможность компилятора разруливать перегрузки по количеству параметров типов. Надо бы добавить такой тест, чтобы нечаянно не угробить эту замечательную возможность.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: testsuite/positive/generic-nongeneric.n
От: _nn_ www.nemerleweb.com
Дата: 25.04.10 10:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _nn_, Вы писали:


__>>Для .Net 4.0.

__>>Да вот здесь
Автор: _nn_
Дата: 22.04.10
все описано.


VD>Ясно. В МС как всегда много оригиналов. Обратной совместимости предпочитают более логичный дизайн.


Там еще запутаней оказалось.
System.Action до 8-ми аргументов находится в mscorlib.dll , а с 9-ти до 16-ти в System.Core и аналогично с System.Func
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.