Мой c# пользовательский делегат ведет себя странно (нет перегрузки для <X>совпадений ) - PullRequest
0 голосов
/ 25 января 2020

Хорошо, поэтому после прочтения создания делегатов пользовательских функций после Fun c <> не принял ключевое слово ref в объявлении типа , я получил этот делегат:

private delegate TResult RefFunc<T, out TResult>(ref T arg);

внутри моего маленького тестового проекта. Я также объявил эти две функции:

private static string FirstFunction(string arg) {
    return "";
}
private static string SecondFunction(string arg) {
    return "";
}

(Так как я обнаружил проблему, это действительно единственное содержимое функции!)
, которые придерживаются вышеуказанного делегата и передаются в качестве параметров этой функции:

private static void SampleFunction(RefFunc<String, String> argOne, RefFunc<String, String> argTwo) { ... }

Примерно так (упрощенно):

private static void Main(string[] args) {
    SampleFunction(FirstFunction, SecondFunction);
}

Этот вызов функции не сработает, поскольку "Conversion of 'method group' to '<class>.RefFunc<string, string>' isn't possible", что имеет смысл - я Я напрямую передаю функцию, не превращая ее сначала в делегата - хотя я почти уверен, что видел тот же синтаксис, где-то работающий с делегатом Action <> В любом случае, я затем изменил свой код вызывающего абонента в функции Main () разными способами, глядя на проблему, однако ни один из приведенных ниже подходов не решил эту проблему.

SampleFunction(new RefFunc<String, String>(FirstFunction), ...); // Causes "No overload for FirstFunction matches delegate RefFunc<string, string>" at the first function parameter
SampleFunction(RefFunc FirstFunction, ...); // Was worth a try
RefFunc handler = FirstFunction; SampleFunction(handler, ...); // As described in docs. Causes "The usage of type "RefFunc<T, TResult>" (generic) requires 2 type arguments" at keyword RefFunc
RefFunc<String, String> handler = FirstFunction; SampleFunction(handler, ...); // Didn't help it. Causes the same error as with the first attempt
// and a few others

Docs
Я наконец решил обратиться к stackoverflow. Поскольку мои функции четко соответствуют делегату, которого я создал, я не могу понять, почему C# считает, что они этого не делают. Я ценю любую помощь!
Обратите внимание, что, хотя я показываю только код, относящийся к вызванной ошибке, проект очень маленький, поэтому я уверен, что проблема не в ie в другом месте

1 Ответ

1 голос
/ 25 января 2020

Поскольку мои функции четко соответствуют делегату, который я создал

К сожалению, ни один из ваших FirstFunction и SecondFunction не относится к типу RefFunc только потому, что T передается ref в определении делегата, и в то же время вам не хватает ref в ваших реальных функциях.

Либо вы модифицируете обе функции

public class Program
{
    private delegate TResult RefFunc<T, out TResult>(ref T arg);

    private static string FirstFunction(ref string arg) {
       return "";
    }
    private static string SecondFunction(ref string arg) {
       return "";
    }

    private static void SampleFunction(
        RefFunc<String, String> argOne, RefFunc<String, String> argTwo) 
    { 
    }

    public static void Main()
    {
        SampleFunction(FirstFunction, SecondFunction);
    }
}

, либо вы отбрасываете ref

private delegate TResult RefFunc<T, out TResult>(T arg);

, который теперь является правильным типом для

private static string SecondFunction(string arg) {
    return "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...