2017-01-11 1 views
8

Например, у меня естьВ C# 7 можно ли деконструкции кортежи в качестве аргументов метода

 void test(Action<ValueTuple<string, int>> fn) 
     { 
      fn(("hello", 10)); 
     } 

     test(t => { 
      var (s, i) = t; 
      Console.WriteLine(s); 
      Console.WriteLine(i); 
     }); 

Я хотел бы написать что-то вроде этого

 void test(Action<ValueTuple<string, int>> fn) 
     { 
      fn(("hello", 10)); 
     } 

     test((s,i) => { 
      Console.WriteLine(s); 
      Console.WriteLine(i); 
     }); 

Возможно ли это с какой-то правильной записи?

ответ

8

Вы можете сократить его:

void test(Action<ValueTuple<string, int>> fn) 
{ 
    fn(("hello", 10)); 
} 

test(((string s, int i) t) => 
{ 
    Console.WriteLine(t.s); 
    Console.WriteLine(t.i); 
}); 

Будем надеяться, что в один прекрасный день мы могли бы восклицательный знак параметров из кортежа в вызове метода:

void test(Action<ValueTuple<string, int>> fn) 
{ 
    fn(@("hello", 10)); // <-- made up syntax 
} 

test((s, i) => 
{ 
    Console.WriteLine(s); 
    Console.WriteLine(i); 
}); 

Но не в данный момент.

+0

С некоторыми методами расширения ('публичный статический объект [] ToArray (это ValueTuple т) {возвращение новый объект [] {t.Item1, t.Item2};} ') вы можете использовать' fn.DynamicInvoke ((«hello», 10) .ToArray()); '- конечно, в этот момент это может иметь больше смысла чтобы просто расширить 'Invoke'. – NetMage

+0

Очень хороший ответ. Я пытался найти этот синтаксис в документах и ​​не преуспел. Не могли бы вы предоставить ссылку на документы, где это объясняется? –

+0

@AndriiLitvinov, что вы имеете в виду? –

2

Существует два способа поиска вашего запроса, но ни один из них не поддерживается в C# 7.0.

  • Один из них - разбиение кортежей на аргументы: вызов метода с кортежем и включение элементов кортежа в отдельные аргументы метода. Вы можете сделать это сегодня вручную, вызывая M(tuple.first, tuple.second).
  • Другое - деконструкция в лямбда-параметрах: когда лямбда вызывается с параметром, деконструируйте эти параметры на элементы и используйте эти элементы в лямбда-теле. Вы можете сделать это сегодня вручную, указав лямбда как x => { var (first, second) = x; Write(first); Write(second); }.

Есть предложения, обсуждаемые в репозитории дизайна csharplang.

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

  • Нет связанных вопросов^_^