Comments 19
1. Зачем
Когда expr is Type возвращает bool?
2. Обязательно ли record type будет ссылочным? Возможно ли наследование?
3. Является ли знак " * " литералом, который транслируется в default(T) или тут применено более сильное колдунство?
var v = expr as Type;
if (v != null) {
// Используем v
}
Когда expr is Type возвращает bool?
2. Обязательно ли record type будет ссылочным? Возможно ли наследование?
3. Является ли знак " * " литералом, который транслируется в default(T) или тут применено более сильное колдунство?
+1
1) потому что expr имеет тип Expr, а v — тип Type. чтобы пользоваться возможностями типа Type и не делать лишних преобразований.
2) пример class Const(double Value): Expr; показывает, что наследование возможно.
3) нет, скорее он транслируется в var $temp, где переменная $temp нигде не используется.
2) пример class Const(double Value): Expr; показывает, что наследование возможно.
3) нет, скорее он транслируется в var $temp, где переменная $temp нигде не используется.
+3
2. Дополнение: судя по оригиналу, record struct тоже возможно. Так что не обязательно ссылочный.
0
Думаю что конечным ответом на вопрос 2 будет, нет.
0
А откуда в выражении
if (c is Polar(5, *)) Console.WriteLine( R );берется R?
+2
Спасибо, я ошибся, уже исправил.
+1
Похоже, что опечатка. Интересно другое:
— верно ли, что «s is Polar(5,*)» полностью эквивалентно «s is Polar(var $R,*) && $R==5»;
— можно ли использовать такой же трюк в других вызовах с out
— можно ли в других вызовах с out использовать var и *;
— можно ли переопределить matching с входным параметром, чтобы вставить свою функцию проверки истинности (например, Math.Abs(R-5)<eps)
— верно ли, что «s is Polar(5,*)» полностью эквивалентно «s is Polar(var $R,*) && $R==5»;
— можно ли использовать такой же трюк в других вызовах с out
— можно ли в других вызовах с out использовать var и *;
— можно ли переопределить matching с входным параметром, чтобы вставить свою функцию проверки истинности (например, Math.Abs(R-5)<eps)
+2
1) Мне кажется нет. Судя по всему определение перемененной будет в следующем блоке.
2) Вряд ли, это фишка оператора is
3) Это вроде как новая фишка C# общая.
4) Не понял, что вы имеете ввиду.
2) Вряд ли, это фишка оператора is
3) Это вроде как новая фишка C# общая.
4) Не понял, что вы имеете ввиду.
0
4) Что-нибудь такое:
Потому что иначе приведённый пример сработает только на 12 точках, а для остальной окружности скажет false.
public static class Polar
{
public static bool operator is(Cartesian c, out double R, out double Theta)
{
R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
Theta = Math.Atan2(c.Y, c.X);
return c.X != 0 || c.Y != 0;
}
public static bool operator is(Cartesian c, double R, out double Theta)
{
if(Math.Abs(Math.Sqrt(c.X*c.X + c.Y*c.Y)-R)>R*1e-6) return false;
Theta = Math.Atan2(c.Y, c.X);
return c.X != 0 || c.Y != 0;
}
}
Потому что иначе приведённый пример сработает только на 12 точках, а для остальной окружности скажет false.
0
Да вы правы, плохо изучил ваш пример, информации об этом в спецификации, я не нашел. Но судя по общей логике это не учли, хотя все может изменится в любой момент.
0
UFO just landed and posted this here
Sign up to leave a comment.
Что нам готовит C# 7 (Часть 2. Pattern matching)