Неясное поведение Tuple-ов
От: valeskas  
Дата: 11.03.12 09:02
Оценка:
using System;
using System.Linq;
using System.Console;

def x1 = [("1", "1"), ("2", "2")];
def x2 = [("1", 1), ("2", 2)];

def z1(v) { WriteLine(String.Join(",", v.Select(((a, b))=>{$"$(a)=$(b)"}).ToArray())) };
def z2(v) { WriteLine(String.Join(",", v.Select(((a, b))=>{$"$(a)=$(b)"}).ToArray())) };
z1(x1);
z2(x2);


вывод:

d:\projects\NemerleTest>ncc32 -no-color -out:test4.exe -r:System.Xml.Linq test4.n && test4
(1, 1)=0,(2, 2)=1
1=1,2=2


баг или фича?
Re: Неясное поведение Tuple-ов
От: hardcase Пират http://nemerle.org
Дата: 11.03.12 09:23
Оценка: :)
Здравствуйте, valeskas, Вы писали:

V>баг или фича?


По видимому баг, должна выбираться одна и та же перегрузка Select-а: судя по ((a, b)) — только неявное сопоставление с кортежем. Выбор перегрузки Select с индексом — ошибка.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Неясное поведение Tuple-ов
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.03.12 14:55
Оценка:
Здравствуйте, valeskas, Вы писали:

V>баг или фича?


Стечение обстоятельств. Там получается сложное наложение перегрузок и автоматическое преобразование кортежа в список параметров. Поведение конечно нежелательное. Но логически объяснимое.

Обойти это можно задав паттерн говорящий компилятору, что в параметре "a" ожидается именно кортеж:
def z2(v) { WriteLine(String.Join(",", v.Select((((_, _) as a, b))=>{$"$(a)=$(b)"}).ToArray())) };


Когда будет по больше свободного времени можно будет попробовать по колдовать над этим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.