Здравствуйте, VladD2, Вы писали:
VD>Плюс смущает, что "i is int?" вообще компилируется. Ведь i имеет тип int, а не int?. Это случаем не баг? VD>Какой раздел спецификации описывает это дело?
Ну так раз i is int? вообще не компилируется, значит тут никакой неоднозначности нет.
Здравствуйте, VladD2, Вы писали:
ВВ>>Ну так раз i is int? вообще не компилируется, значит тут никакой неоднозначности нет. VD>Я привел полностью компилируемый код.
Да, пардон. Что-то у меня уже от недосыпа в глаза двоится.
Здравствуйте, VladD2, Вы писали:
VD>Что-то я не въеду в принципы по которым компилятор должен отличать nullable-тип и оператор "? :". VD>Например: VD>
VD>int i = 0;
VD>Console.WriteLine(i is int?);
VD>Console.WriteLine(i is int? "+" : "-");
VD>Надо заглядывать вперед анализируя наличие ":"? Или есть более простая эвристика?
А если наоборот — проверять является ли выражение проверкой типа? Т.е. не так уж и много вариантов завершения проверки i is int? — ";", ")", "]", "?"... Просто касательно провреки на наличие ":" мне не очень понятно ( по кр. мере сейчас ). Ведь между "?" и ":" может быть километр кода.
Здравствуйте, VladD2, Вы писали:
VD>Что-то я не въеду в принципы по которым компилятор должен отличать nullable-тип и оператор "? :". VD>Например: VD>
VD>int i = 0;
VD>Console.WriteLine(i is int?);
VD>Console.WriteLine(i is int? "+" : "-");
VD>Надо заглядывать вперед анализируя наличие ":"? Или есть более простая эвристика?
VD>Плюс смущает, что "i is int?" вообще компилируется. Ведь i имеет тип int, а не int?. Это случаем не баг? VD>Какой раздел спецификации описывает это дело?
Это самая плохо специфицированная часть стандарта C#. Стандарт по этому поводу ничего не говорит.
Можно вычислить FIRST(expression) и FOLLOW(expression) и проанализировать первый токен после '?'.
токены FIRST(expression) будут соответствовать выражению
токены FOLLOW(expression) будут соответствовать типу
Подобные примеры не специфицированы потому что при их разборе не возникает неоднозначностей. Да, надо проводить чуть более сложный анализ, но разбор корректного выражения синтаксически всегда однозначен.
class tint<T> where T: struct{};
static void Main()
{
int i = 0;
Console.WriteLine(i is int?);
Console.WriteLine(i is tint<int>); // а тут false
Console.WriteLine(i is int? "+" : "-");
new Program();
}
Здравствуйте, Alexander__S, Вы писали:
A__>Здравствуйте, VladD2, Вы писали:
VD>>Плюс смущает, что "i is int?" вообще компилируется. Ведь i имеет тип int, а не int?. Это случаем не баг?
A__>Так же, как компилируется i is object, i is SomeType и проч. зачем тогда вообще нужен is? Я понимаю, четыре часа ночи...
VladD2 хотел сказать, что если
int i;
Console.Write( i is int? );
или
int? i;
Console.Write( i is int );
то в обоих случаях на экран вылезет true. И это действительно странно, ибо
public struct Nullable<T> where T : struct
вряд ли должно соответствовать типу T.
Провёл пару экспериментов, -> пришёл к выводу, что тип Nullable в самом деле выделен на уровне языка.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>А если наоборот — проверять является ли выражение проверкой типа? Т.е. не так уж и много вариантов завершения проверки i is int? — ";", ")", "]", "?"...
О том и речь. Но хотелось бы иметь четкий алгоритм, а не придумывать собственные эвристики.
ВВ>Просто касательно провреки на наличие ":" мне не очень понятно ( по кр. мере сейчас ). Ведь между "?" и ":" может быть километр кода.
О том и речь. Нужно будет вручную (для гребаного CocoR) распознать любое выражение . Но есть нужен или пасрер LL(*), или много ручного траха.
... << RSDN@Home 1.2.0 alpha rev. 628>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Алексей., Вы писали:
А>Подобные примеры не специфицированы потому что при их разборе не возникает неоднозначностей. Да, надо проводить чуть более сложный анализ, но разбор корректного выражения синтаксически всегда однозначен.
Однозначен то он однозначен. Но это же требует LL(*)-парсера.
Мне нужно азрулить ситуацию на CocoR который строит только LL(1)-парсеры с возможностью ручного заглядывания вперед (хоть до посинения).
Так вот у меня есть варианты:
1. Попытаться распознать выражение идущее за "?". Если выражение распознается и за ним идет ":" мы имеем дело с оператором "?:" и дело в шляпе. Если нет, то принимаем решение, что "?" — это часть определения типа.
Так вот проблема в том, что ручной анализ выражения — это застрелиться .
2. Придумать некую эвристику (наподобии той, что применяется для разруливания неоднозначностей с "F(G<A, B>(7));".
В общем, первый способ конечно надежен, но сложен и медленнен. Между тем, описанная неоднозначность возникает только в случае применения оператора "is" в сочетании с нулбл-типами и/или оператором "?:".
Вот и хотелось бы попытаться определить эвристику по которой можно было бы ограничиться проверкой некоторого набора лексем.
Ведь если пойти логически, то если после "?" следуют: ")", "=", "?" (возможно что-то еще), то "?" точно являетс частью определения типа.
Вот и хотелось бы попытаться продумать набор таких предположений и проверить не возникает ли при этом каких-то проблем.
... << RSDN@Home 1.2.0 alpha rev. 628>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, RoloTomasi, Вы писали:
RT>Ладно компилируется почему true получаем?
Более корректный тест будет выглядеть так:
using System;
class Test<T> where T: struct
{
public Test(T t) { _t = t; }
T _t;
public static implicit operator T(Test<T> test) { return test._t; }
};
class Program
{
static void Main()
{
int i = 0;
Console.WriteLine(i is int);
Console.WriteLine(i is Test<int>); // а тут false
Console.WriteLine(i is int?);
Console.WriteLine(i is int? "+" : "-");
Console.WriteLine(i is int ? ?"+" : "-");
}
}
но все равно получается false. Так что поддержка нулбл-типов явно встроена в язык по самые помидоры. Или это ошибка компилятора.
... << RSDN@Home 1.2.0 alpha rev. 628>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>но все равно получается false. Так что поддержка нулбл-типов явно встроена в язык по самые помидоры. Или это ошибка компилятора.
Извините за настырность, но опять-таки, почему компилятора? Может быть, все-таки CLR в рантайме во время выполнения оператора is проверяет, является ли тип Nullable, инстанцированным данным типом?
Здравствуйте, Alexander__S, Вы писали:
A__>Извините за настырность, но опять-таки, почему компилятора? Может быть, все-таки CLR в рантайме во время выполнения оператора is проверяет, является ли тип Nullable, инстанцированным данным типом?
Здравствуйте, Alexander__S, Вы писали:
A__>Извините за настырность, но опять-таки, почему компилятора? Может быть, все-таки CLR в рантайме во время выполнения оператора is проверяет, является ли тип Nullable, инстанцированным данным типом?
Тут компилятор сразу пишет "результат"
int i = 0;
Console.WriteLine(i is int?);
Console.WriteLine(i is int? "+" : "-");