Информация об изменениях

Сообщение Re: Что-то я не понимаю. C# 7 доступен в VS 2015? от 08.03.2017 23:19

Изменено 08.03.2017 23:23 VladD2

Re: Что-то я не понимаю. C# 7 доступен в VS 2015?
Здравствуйте, VladD2, Вы писали:

VD>Разве это не фичи 7-го Шарпа?


Проверил работу локальных функций:
    static string ToText(string text)
    {
      if (!text.StartsWith("<hint>", StringComparison.InvariantCultureIgnoreCase))
        return text;

      void XmlToString(StringBuilder builder, XContainer container)
      {
        foreach (var n in container.Nodes())
        {
          switch (n)
          {
            case XElement e when e.Name == "br" || e.Name == "bl": builder.AppendLine(); break;
            case XContainer c: XmlToString(builder, c); break;
            case XText t: builder.Append(t.Value); break;
          }
        }
      }

      var sb = new StringBuilder();
      XmlToString(sb, XElement.Parse(text));
      return sb.ToString();
    }

Работают. Но вывода типов для них нет, по сему типы параметров надо указывать всегда. Лажает Майкрософт. До Немерла 2006-го не дотягивают.

А с кортежами проблема:
      (int x, string y) foo()
      {
        return (42, "yaho!");
      }


Пишет:

C:\!\Nitra\Ide\NitraCommonVSIX\Models\FileModel.cs(209,16,209,29): error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported
C:\!\Nitra\Ide\NitraCommonVSIX\Models\FileModel.cs(207,7,207,24): error CS8137: Cannot define a class or member that utilizes tuples because the compiler required type 'System.Runtime.CompilerServices.TupleElementNamesAttribute' cannot be found. Are you missing a reference?
C:\!\Nitra\Ide\NitraCommonVSIX\Models\FileModel.cs(207,7,207,24): error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported


то есть нужна какая-то дополнительная либа...

Ага. С этим тоже разобрался. Надо было поставить NuGet-пакет System.ValueTuple.

return ref тоже пашет:
      ref int foo(int[] ary)
      {
        return ref ary[2];
      }

      var ary2 = new[] { 2, 4, 6, 8 };
      foo(ary2) = 42;


Синарные константы работают (хотя и не особо нужны):
      const int X = 0b010_1010;


Рекорды не пашут. Но вроде их не осилили.

В общем, осталось понять как C# 7 попал на мою машину.
Re: Что-то я не понимаю. C# 7 доступен в VS 2015?
Здравствуйте, VladD2, Вы писали:

VD>Разве это не фичи 7-го Шарпа?


Проверил работу локальных функций:
    static string ToText(string text)
    {
      if (!text.StartsWith("<hint>", StringComparison.InvariantCultureIgnoreCase))
        return text;

      void XmlToString(StringBuilder builder, XContainer container)
      {
        foreach (var n in container.Nodes())
        {
          switch (n)
          {
            case XElement e when e.Name == "br" || e.Name == "bl": builder.AppendLine(); break;
            case XContainer c: XmlToString(builder, c); break;
            case XText t: builder.Append(t.Value); break;
          }
        }
      }

      var sb = new StringBuilder();
      XmlToString(sb, XElement.Parse(text));
      return sb.ToString();
    }

Работают. Но вывода типов для них нет, по сему типы параметров надо указывать всегда. Лажает Майкрософт. До Немерла 2006-го не дотягивают.

А с кортежами проблема:
      (int x, string y) foo()
      {
        return (42, "yaho!");
      }


Пишет:

C:\!\Nitra\Ide\NitraCommonVSIX\Models\FileModel.cs(209,16,209,29): error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported
C:\!\Nitra\Ide\NitraCommonVSIX\Models\FileModel.cs(207,7,207,24): error CS8137: Cannot define a class or member that utilizes tuples because the compiler required type 'System.Runtime.CompilerServices.TupleElementNamesAttribute' cannot be found. Are you missing a reference?
C:\!\Nitra\Ide\NitraCommonVSIX\Models\FileModel.cs(207,7,207,24): error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported


то есть нужна какая-то дополнительная либа...

Ага. С этим тоже разобрался. Надо было поставить NuGet-пакет System.ValueTuple.

return ref тоже пашет:
      ref int foo(int[] ary)
      {
        return ref ary[2];
      }

      var ary2 = new[] { 2, 4, 6, 8 };
      foo(ary2) = 42;


Бинарные константы работают (хотя и не особо нужны):
      const int X = 0b010_1010;


Рекорды не пашут. Но вроде их не осилили.

В общем, осталось понять как C# 7 попал на мою машину.