C# Расширения, работающие в консольном приложении, но не в MVC веб-приложении. Я что-то пропустил? - PullRequest
0 голосов
/ 13 марта 2020

Я использовал расширение ToRanges и Stringify из (https://codereview.stackexchange.com/a/187442/220021) для экспериментов. Когда я использую их в консольном приложении, они работают как положено.

Но когда я добавил их в приложение MVC (то же самое. net 4.7.2 framework), я теперь не могу даже построить (ошибки компиляции) решение. Но я не получаю никаких ошибок в списке ошибок.

..... -> полный путь (я удалил это)

1>------ Build started: Project: App, Configuration: Debug Any CPU ------
1>....\StringExtensions.cs(16,35,16,36): error CS1031: Type expected
1>....\StringExtensions.cs(16,35,16,36): error CS1003: Syntax error, '>' expected
1>....\StringExtensions.cs(16,35,16,36): error CS1519: Invalid token '(' in class, struct, or interface member declaration
1>....\StringExtensions.cs(16,45,16,48): error CS1001: Identifier expected
1>....\StringExtensions.cs(16,45,16,48): error CS1002: ; expected
1>....\StringExtensions.cs(16,52,16,53): error CS1003: Syntax error, ',' expected
1>....\StringExtensions.cs(16,55,16,63): error CS1002: ; expected
1>....\StringExtensions.cs(16,55,16,63): error CS1520: Method must have a return type
1>....\StringExtensions.cs(18,19,18,22): error CS1003: Syntax error, '(' expected
1>....\StringExtensions.cs(18,49,18,50): error CS1026: ) expected
etc etc

Вот как добавлен код

using System.Collections.Generic;
using System.Linq;

namespace App.App_Code_classes
{
    public static class StringExtensions
    {

    //source https://codereview.stackexchange.com/a/187442
    public static IEnumerable<(int Min, int Max)> ToRanges(this IEnumerable<int> source)
    {
        using (var e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                yield break;
            }

            var previous = e.Current;

            var range = (Min: previous, Max: e.Current);

            while (e.MoveNext())
            {
                var isConsecutive = e.Current - previous == 1;
                if (isConsecutive)
                {
                    range = (range.Min, e.Current);
                }
                else
                {
                    yield return range;
                    range = (e.Current, e.Current);
                }
                previous = e.Current;
            }

            yield return range;
        }
    }

    //source https://codereview.stackexchange.com/a/187442
    public static string Stringify(this IEnumerable<(int Min, int Max)> ranges)
    {
        var values = ranges.Select(range => $"{(IsEmpty(range) ? $"{range.Min}" : $"{range.Min}-{range.Max}")}");
        return string.Join(", ", values);

              bool IsEmpty((int Min, int Max) range)
             {
                 return range.Max - range.Min == 0;
             }
         }
     }
 }

Я использую другие расширения в приложении MVC, и они работают как положено, я что-то упустил? Или как я могу справиться с этим?

1 Ответ

1 голос
/ 13 марта 2020

Весьма вероятно, что ваш MVC проект все еще использует более низкую C# языковую версию. Поскольку ваш кортеж поддерживается только в C# 7 (https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7#tuples)

Обратите внимание, что это языковая версия C#, а не. NET Версия Framework.

Чтобы проверить, какая версия, если вы используете Visual Studio, вы можете щелкнуть правой кнопкой мыши по своему проекту -> Свойства -> Построить -> Расширенные. В этом списке будут перечислены доступные версии, а также версия, которую использует ваш proj.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...