C#: params и сигнатура
От: Zhilich  
Дата: 11.09.09 14:13
Оценка:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
public class Program
{
public void f(params object[] o) { } // метод 1

public void f(object o) { } // метод 2

static void Main(string[] args)
{
Program program = new Program;
program.f(5);
}
}
}


Эта программа успешно компилируется, однако очевидна неоднозначность (какой из методов будет вызван?). Считаете ли вы это нормальным явлением в специфике языка C#?
Re: C#: params и сигнатура
От: gecko  
Дата: 11.09.09 15:12
Оценка:
Здравствуйте, Zhilich, Вы писали:

Z>using System;

Z>using System.Collections.Generic;
Z>using System.Text;

Z>namespace ConsoleApplication1

Z>{
Z> public class Program
Z> {
Z> public void f(params object[] o) { } // метод 1

Z> public void f(object o) { } // метод 2


Z> static void Main(string[] args)

Z> {
Z> Program program = new Program;
Z> program.f(5);
Z> }
Z> }
Z>}


Z>Эта программа успешно компилируется, однако очевидна неоднозначность (какой из методов будет вызван?). Считаете ли вы это нормальным явлением в специфике языка C#?


Интуитивно понятно, что предпочтение должно отдаваться методам с конкретной сигнатурой, т. е. вызовется метод 2.

Этот шаблон, между прочим, используется во фреймворке, например

String.Format(string format, object arg0);

String.Format(string format, object arg0, object arg1);

String.Format(string format, object arg0, object arg1, object arg2);

String.Format(string format, params object[] args);


Для 1-3 аргументов вызывается специальный метод (с большей эффективностью), для остальных — общий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.