Здравствуйте, AndrewVK, Вы писали:
AVK>Интересно, почему так нельзя: AVK>А так можно:
Ну формально, как уже заметили, такая грамматика:
using-alias-directive:
using identifier = namespace-or-type-name ;
Видимо, осталось со времен C# 1.0, когда было решено, что (наверное, для ясности) нельзя делать алиасы для указателей и массивов. А потом грамматика перекочевала в следующие версии без изменений.
Здравствуйте, xvost, Вы писали:
X>Это, кстати, хороший вопрос. Ибо в спецификации c# ЯВНО сказано о полной взаимозаменяемости синтаксисов T? и Nullable<T>
Действительно, написано так:
A nullable type is written T?, where T is the underlying type. This syntax is shorthand for System.Nullable<T>, and the two forms can be used interchangeably.
Но видимо, эту обобщающую фразу не нужно понимать слишком буквально. Вот другой пример:
class Program
{
static void Main()
{
System.Nullable<int>.Equals(null, null); // OKint?.Equals(null, null); // Invalid expression term '.'
}
}
Здравствуйте, xvost, Вы писали:
X>Ну понятно почему — потому что по грамматике справа от "=" ожидается type or namespace name, и по той же грамматике "?" в него не входит.
Грамматика — следствие. Вопрос в том — это просто недосмотр или так специально задумано?
Здравствуйте, AndrewVK, Вы писали:
AVK>Грамматика — следствие. Вопрос в том — это просто недосмотр или так специально задумано?
Я думаю что недосмотр.
Одно "но" — мне лень сейчас проводить анализ, что возможно будут проблемы неоднозначного парсинга nullable-типов и "?:" выражений. Возможно как раз тут кроется причина
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
В using вообще нельзя создать alias на любой Nullable тип, а не только generic, если записывать его с "?".
Чтобы это сделать нужно указывать Nullable тип в форме System.Nullable<T>.
Т.е. ваш alias можно было бы записать в виде:
using MyAlias = System.Nullable<MyGenericType<MyType>>
А зделать со знаком вопроса так нельзя потому, что по спецификации C# не положено.
Здравствуйте, AndrewVK, Вы писали:
AVK>Интересно, почему так нельзя: AVK>
AVK>using MyAlias = MyGenericType<MyType>?;
AVK>
AVK>А так можно: AVK>
AVK>using MyAlias = MyGenericType<MyType?>;
AVK>
Думаю, что это просто ошибка в парсере. В прочем, это может быть более глубокая ошибка — ошибка в эвристике применяемой для устранения неоднозначности знака "?" или знака ">".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Думаю, что это просто ошибка в парсере. В прочем, это может быть более глубокая ошибка — ошибка в эвристике применяемой для устранения неоднозначности знака "?" или знака ">".
Нет, парсер здесь действует точно по стандарту. Другой вопрос, что это может быть недоработка в стандарте.
Здравствуйте, nikov, Вы писали:
N>Интересно, почему так нельзя: N>
N>using MyAlias = int;
N>
N>А так можно: N>
N>using MyAlias = System.Int32;
N>
Наверное потому что практического смысла давать алиасы уже существующим в языке хардкодным алиасам смысла нет. Хотя конечно гипотетическую полезность от такого финта придумать можно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали: AVK>Наверное потому что практического смысла давать алиасы уже существующим в языке хардкодным алиасам смысла нет. Хотя конечно гипотетическую полезность от такого финта придумать можно.
А ввести алиас на алиас можно?
типа:
using MyAlias = System.Int32;
using MyAlias2 = MyAlias;
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>А ввести алиас на алиас можно?
9.4.1 Using alias directives
....
The order in which using-alias-directives are written has no significance, and resolution of the namespace-or-type-name referenced by a using-alias-directive is not affected by the using-alias-directive itself or by other using-directives in the immediately containing compilation unit or namespace body. In other words, the namespace-or-type-name of a using-alias-directive is resolved as if the immediately containing compilation unit or namespace body had no using-directives.
То есть, нельзя ввести алиас на алиас, определенный в той же декларации пространства имен, но можно — на определенный во внешней.