2016-09-01 3 views
3

Я загрузил Enterprise 2015 Preview 3. Как заставить эту программу работать под C# 7?Новая функция соответствия

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

abstract class Animal { } 
class Dog : Animal 
{ 
    public string BarkLikeCrazy() 
    { 
     return "WOOF WOOF WOOF"; 
    } 
} 

class Cat : Animal { } 
class Swan : Animal { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var animals = new Animal[] { new Dog(), new Cat(), new Swan() }; 

     var organizedAnimals = from animal in animals 
           let sound = animal match(
            case Dog d: "woof... " + d.BarkLikeCrazy() 
            case Cat c: "meow" 
            case * : "I'm mute.." 
          ) 
           select new { Type = animal, Sound = sound }; 

     foreach (var animal in organizedAnimals) 
     { 
      Console.WriteLine($"{animal.Type.ToString()} - {animal.Sound}"); 
     } 

     Console.ReadKey(); 
    } 
} 
+0

Вы говорите о VS "15" Preview 3? Или VS 2015 Update 3? Это сбивает с толку, но эти два полностью разделены. Кроме того, я не думаю, что 'match' будет в C# 7.0. – svick

+0

Это часть помощи показывает: Microsoft Visual Studio Enterprise 15 Preview 3 Версия 15.0.25428.1 PREVIEW Microsoft .NET Framework Версия 4.6.01055 Установленная версия: Enterprise Архитектура и инструменты моделирования 00369-50000-00000- AA450 Microsoft Архитектура и инструменты моделирования Visual C# 15 Preview 3 00369-50000-00000-AA450 Microsoft Visual C# 15 Preview 3 Visual C++ 15 Preview 3 00369-50000-00000-AA450 Microsoft Visual C++ 15 Preview 3 – Ivan

+0

Жаль, если матч не делает этого. Это было в F # в течение многих лет. – Ivan

ответ

1

Изменить match ключевое слово в switch.

var organizedAnimals = from animal in animals 
         let sound = animal switch(
          case Dog d: "woof... " + d.BarkLikeCrazy() 
          case Cat c: "meow" 
          case * : "I'm mute.." 
        ) 
         select new { Type = animal, Sound = sound }; 

Вы можете прочитать об эволюции этого в discussion on GitHub (до присоединяемых к Pattern Matching спецификации).

Вот пример этого из GitHub feature discussion:

var areas = 
    from primitive in primitives 
    let area = primitive switch (
     case Line l: 0, 
     case Rectangle r: r.Width * r.Height, 
     case Circle c: Math.PI * c.Radius * c.Radius, 
     case *: throw new ApplicationException() 
    ) 
    select new { Primitive = primitive, Area = area }; 
+0

Я получаю всевозможные ошибки, первый из которых находится в матче «Тело запроса должно заканчиваться предложением select или предложением группы». У меня есть (underscoreunderscore) __DEMO __, __ DEMO_EXPERIMENTAL__, определенный для проекта. – Ivan

+0

Я также заметил, что вы связались с Рослин. Не уверен, что отношение Roslyn к 2015 Enterprise Preview 3. – Ivan

+0

Вы ищете новые возможности C# 7 - Roslyn - это компилятор C#. Похоже, вам нужно пройти через шаги, чтобы использовать возможности C# 7 в вашем проекте. См .: http://www.strathweb.com/2016/03/enabling-c-7-features-in-visual-studio-15-preview/ –

0

Как мне сделать эту программу работы по C# 7?

У вас нет. Соответствие шаблону, основанное на выражении, недоступно в текущем предварительном просмотре C# 7.0 и не планируется для окончательной версии C# 7.0.

The form that's currently planned for "C# 7.0 + 1" выглядит следующим образом:

var organizedAnimals = from animal in animals 
         let sound = animal switch (
          case Dog d: "woof... " + d.BarkLikeCrazy(), 
          case Cat c: "meow", 
          case *: "I'm mute.." 
         ) 
         select new { Type = animal, Sound = sound }; 
+0

Я только что обновил до последнего C# предварительного просмотра (17?), И это все еще не работает. – Ivan

+0

@ Ivan VS 2017 RC все еще содержит только C# 7.0.В настоящее время нет версии VS или компилятора C#, где это будет работать. – svick

Смежные вопросы