:: Не фоксом единым
C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Сижу, любуюсь на VisualStudio 2017. Как оказалось, не всё, что писали про него - правда. Так

static public void myFunc(out int x)
{
x = 2;
}
static void Main(string[] args)
{
myFunc(out int y); //
Console.WriteLine(y);
Console.ReadLine();
}

работает, а указанная на blogs.msdn.microsoft.com конструкция out * не работает:

static public void myFunc(out int x, out int z)
{
x = 2;
z = 2;
}
static void Main(string[] args)
{
myFunc(out int y, out *); // нельзя игнорировать ненужный out параметр, так не работает
Console.WriteLine(y);
Console.ReadLine();
}

Может вообще отказались от такого синтаксиса, а может пока отложили "на потом".

Локальные функции работают:

static public int MyFunc(int x)
{
return LocalFunc(x) + 1;
int LocalFunc(int i) // локальная функция
{
return i + 1;
}
}
static void Main(string[] args)
{
Console.WriteLine(MyFunc(1));
Console.ReadLine();
}

Лично мне больше всего нравится:

int? i = null;
if (i is null) // море восторга и щенячьего визга
{
return;
}

После интерполяции строк (введённой в C# 6) это будет моим любимым новшеством - срочно во всех программах выкину
"==null"



Исправлено 1 раз(а). Последнее : S-type, 11.03.17 18:11
Ratings: 0 negative/0 positive
Re: C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Вот чего я не понял после установки VisualStudio 2017 - почему не работает конструкция

var tuple = ("Иванов", 1973);

Понятно, что если через NuGet установить System.ValueTuple, то она будет работать. Но, в C# 7 она ведь должна была быть "встроенной", а не "скачиваемой". Или, я что то не так понимаю?

В нете много описаний "new in c# 7" от прошлого года. Попробовал поискать на сайте MS официальное описание - что же нового в языке C# 7 (в VS 2017), и - не нашёл. Где можно взять официальный список новшеств в C# 7?
Ratings: 0 negative/0 positive
Re: C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Вот, например, docs.microsoft.com . Это официально? Написано:

Цитата:
To support these scenarios tuples were added to C#.
[...]

You can create a tuple by assigning each member to a value:


var letters = ("a", "b");

That assignment creates a tuple whose members are Item1 and Item2, following the existing Tuple syntax.


Обратил внимание, что tuple - с маленькой буквы. Проверил, так - работает:

(string, int) GiveMeATuple()
{
return ("Иванов", 1973);
}

А так:

(string, int) GiveMeATuple()
{
return Tuple.Create("Иванов", 1973); // ошибка
}

выдаёт ошибку. Т.е. Tuple - это класс, а tuple - это ключевое слово для создания пользовательского типа данных (аналогично class или struct). Но, поскольку кортеж создаётся с помощью (), это скорее больше похоже на массив, создаваемый []. Я правильно понимаю?



Исправлено 1 раз(а). Последнее : S-type, 11.03.17 20:47
Ratings: 0 negative/0 positive
Re: C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Проверил - работает:

class MyClass
{
public (int s, int i) tupleField;
}
class Program
{
static void Main(string[] args)
{
MyClass sss = new MyClass();
sss.tupleField = (3, 5);
}
}

И даже так то же работает:

class MyClass
{
public (int s, int i) TupleField { set; get; }
}
class Program
{
static void Main(string[] args)
{
MyClass sss = new MyClass();
sss.TupleField = (3, 5);
}
}
Ratings: 0 negative/0 positive
Re: C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
При запуске VS отображаются новости. Во вчерашних новостях есть blogs.msdn.microsoft.com Там сказано:

Цитата:
Tuples rely on a family of underlying generic struct types called ValueTuple<...>. If you target a Framework that doesn’t yet include those types, you can instead pick them up from NuGet:

translate.google.com переводит как

Цитата:
Кортежи полагаются на семейство базовых структурных типов, называемых ValueTuple <...>. Если вы настроите таргетинг на Framework, который еще не включает эти типы, вы можете вместо этого выбрать их из NuGet:

Смысл выделенного курсивом не улавливается, явно как то косо переведено. То, что можно установить через NuGet пакет System.ValueTuple, это понятно. А какая альтернатива - если пакет не устанавливать?
Ratings: 0 negative/0 positive
Re: C# 7
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
C# проект имеет target framework - можно указать что это будет 4.6.2, или к примеру 4.0. А там никаких ValueTuple<...> нет, но рантайм то у всей линейки 4* фреймворков одинаков - т.е. принципиальных препятствий к тому чтобы это работало нет. Поэтому и пишут что вместо установки соответствующей версии SDK и самого целевого фреймворка (а это значит что и у клиента потребуется устанавливать соответствующую версию) можно просто добавить в проект ссылку на библиотеку с реализацией этого типа.
Перевод совершенно правильный. Либо ставишь таргетинг на "новую" версию и тогда не надо ничего добавлять, там тип уже "встроен". Если же ставишь таргетинг на старую - то надо добавить пакет с новыми типами.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Т.е. если я укажу в свойствах проекта версию 4.6.2, то устанавливать через NuGet пакет System.ValueTuple уже не нужно?
Ratings: 0 negative/0 positive
Re: C# 7
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Насколько я в курсе, System.ValueTuple НЕ входит в состав фреймворка версии 4.6.2 (при том пишут что сама его dll валяется в папке компилятора 2017 студии). Вероятно он будет добавлен во фреймворк в будущих версиях, а пока нужно качать отдельным пакетом.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: C# 7
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
S-type
А так:

(string, int) GiveMeATuple()
{
return Tuple.Create("Иванов", 1973); // ошибка
}

выдаёт ошибку. Т.е. Tuple - это класс, а tuple - это ключевое слово для создания пользовательского типа данных (аналогично class или struct). Но, поскольку кортеж создаётся с помощью (), это скорее больше похоже на массив, создаваемый []. Я правильно понимаю?

Tuple.Create() создаёт кортеж ссылочного типа (class). А литерал (список) создаёт кортеж значимого типа (struct).

ValueTuple<string, int> tuple1 = ValueTuple.Create("Иванов", 1973); // var tuple1 = ("Иванов", 1973);
Tuple<string, int> tuple2 = tuple1.ToTuple(); // упаковка



Исправлено 1 раз(а). Последнее : S-type, 18.04.17 10:13
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 6 PaulWist  (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика