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
{
}
}
}
Здравствуйте, _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).
У меня тут ошибка.
Это я пробовал собрать компилятор для .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
то компилируется.
Здравствуйте, 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 вообще.
Здравствуйте, _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.
Это еще что. У меня сейчас в программе есть вот такой код:
Здесь первый Path — это System.IO.Path, а второй — локальное свойство (строка). И ничего! Все пашет как часы. Даже комплит работает совершенно корректно.
Разрешение перегрузок, однако!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _nn_, Вы писали:
__>В общем нужно подправить тест, чтобы не дергал System.Action вообще.
Ага. Но этот тест раньше, как не странно, проверял возможность компилятора разруливать перегрузки по количеству параметров типов. Надо бы добавить такой тест, чтобы нечаянно не угробить эту замечательную возможность.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.