Итак C# запрещает (может кто знает почему ?) иметь класс и пространство имен с тем же именем:
namespace P
{
namespace A {}
class A {}
class P { static void Main() {} }
}
19: `P.A' clashes with a predefined namespace
Nemerle в свою очередь не запрещает. CLR тоже.
namespace P
{
namespace A {}
class A {}
class P { static Main() : void {} }
}
Ну и можно полет не ограничивать:
using System;
using A.P; // подключает пространство имен и класс одновременно !namespace A
{
namespace P { class J {} }
static class P { public J : int = 1; }
class Q
{
static Main() : void
{
def p = J;
Console.WriteLine(p.GetType());
def x : J = J();
Console.WriteLine(x.GetType());
_ = Console.ReadKey();
}
}
}
Здравствуйте, _NN_, Вы писали:
_NN>Итак C# запрещает (может кто знает почему ?) иметь класс и пространство имен с тем же именем
Не поэтому?
This reveals an interesting point about the design of the “type binding” algorithm in C#. That is, the algorithm which determines what type or namespace a name like “X.Y” is talking about. We do not “backtrack”. We do not say “well, suppose X means this. Then Y would have no meaning. Let’s backtrack; suppose X means this other thing, oh, yes, then Y has a meaning.” We figure out what X unambiguously means, and only then do we figure out what Y means. If X is ambiguous, we don’t check all the possibilities to see if any of them has a Y, we just give up.
Здравствуйте, <Аноним>, Вы писали:
А>This reveals an interesting point about the design of the “type binding” algorithm in C#. That is, the algorithm which determines what type or namespace a name like “X.Y” is talking about. We do not “backtrack”. We do not say “well, suppose X means this. Then Y would have no meaning. Let’s backtrack; suppose X means this other thing, oh, yes, then Y has a meaning.” We figure out what X unambiguously means, and only then do we figure out what Y means. If X is ambiguous, we don’t check all the possibilities to see if any of them has a Y, we just give up.
Перевожу: Мы не осилили написать алгоритм, который это умеет. А идеологию потом придумали. Ибо мы же не можем сказать, что не осилили.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Перевожу: Мы не осилили написать алгоритм, который это умеет. А идеологию потом придумали. Ибо мы же не можем сказать, что не осилили.
Что, прям никто в микрософте не осилил бектрек написать?
Здравствуйте, WolfHound, Вы писали:
WH>Перевожу: Мы не осилили написать алгоритм, который это умеет. А идеологию потом придумали. Ибо мы же не можем сказать, что не осилили.
+1.
Люди же внятно отмазались: "в паре Х.У мы сначала однозначно определяем кто есть Хэ, а потом занимаемся У" (и получаем Й). Хотя могли бы не идти самым тупым и простым путём, а чуть более общо посмотреть на проблему. В конце концов, пространство нэймспэйсов и имена классов — не такие большие и практически не пересекающиеся функционально, могли бы и разрулить! Немерле же это почему-то не помешало!
catbert> Что, прям никто в микрософте не осилил бектрек написать?
Вопрос не в этом, а в том, что это "не прибавляет фичастости"! (а всего лишь помогает в редких случаях не заморачиваться по поводу имён) Соответственно, мракетологи эту фичу вычёркивают из планов, а прогеры с унылым лицом бредут писать идеологическую отмазу.
УГ, коим являлась Жаба, не могла быть грамотно спроектирована и тем более "обобщена" до "платформы .NET", не привнеся костылей предыдущей реализации — видимо, портировали в полной спешке и вопрос стоял "запускается? работает? вываливай в продакшн!". Именно поэтому мы имеем аж ЧЕТЫРЕ несовместимых поколения дотнетины и два GAC'а.
VD>Если серьезно, то там все очень не просто получается. Банальный отказ от разруливания неоднозначностей делает алгоритм в 10 раз проще.
Влад, ты мои мыла получал? Добавь плиз меня в Skype (в профиле).