C # Func (T) не принимает входной параметр типа ref - PullRequest
1 голос
/ 04 марта 2011

Может Func (T) принимает переменные ссылочного типа в C #.

static void Main()
    {
        Func<string,int, int> method = Work;
        method.BeginInvoke("test",0, Done, method);
        // ...
        //
    }
    static int Work(ref string s,int a) { return s.Length; }
    static void Done(IAsyncResult cookie)
    {
        var target = (Func<string, int>)cookie.AsyncState;
        int result = target.EndInvoke(cookie);
        Console.WriteLine("String length is: " + result);
    }

Я не могу определить функцию, которая может принимать входной параметр типа ref.Кто-нибудь, пожалуйста, просветите ...

Ответы [ 2 ]

5 голосов
/ 04 марта 2011

Делегаты Func<T> не могут принимать параметры ref.
Вам необходимо создать собственный тип делегата, который принимает параметры ref.

Однако вы не должны использовать refздесь, в первую очередь.

3 голосов
/ 04 марта 2011

Расширение ответов SLaks.

Семейство делегатов Func<T> является общим и позволяет настраивать тип аргументов и возвращаемых значений.Хотя ref вносит вклад в систему типов C #, на самом деле это не тип на уровне CLR: это модификатор места хранения.Следовательно, невозможно использовать универсальное создание экземпляра для контроля того, является ли конкретное местоположение ref или нет.

Если бы это было возможно, было бы очень легко создать совершенно неверный код.Рассмотрим следующее

T Method<T>() {
  T local = ...;
  ...
  return local;
}

Теперь рассмотрим, что произойдет, если разработчик назвал Method<ref int>().Он будет производить как локальное, так и возвращаемое значение, равное ref.Это приведет к неверному коду C #.

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