Func <t,tresult =“”>参数 - 无法从用法中推断出方法的类型参数</t,>

时间:2014-11-17 08:27:15

标签: c#

我有以下方法

Func<string,IEnumerable<dynamic>> getLpVideos = delegate(string language)
{
    var id = GetBy(language);
    return new List();
}; 

我想将这样的参数传递给泛型方法,但我对如何在 GetObjectFromMemoryCacheWithDefParams 中使用此参数以及如何调用 GetObjectFromMemoryCacheWithDefParams

public T GetObjectFromMemoryCacheWithDefParams<T>(
    string key, Func<string, T> defGetValueFunc) where T : class
{
    var result = _cache.Get(key) as T;

    return result ?? defGetValueFunc();//here error
}


//The type arguments for method cannot be inferred from the usage
var result = CacheService
    .GetObjectFromMemoryCacheWithDefParams(casheName, getLpVideos(lng));

仅当明确提供type参数时才有效。

4 个答案:

答案 0 :(得分:2)

您没有按预期传递Func<string, T>。您正在传递IEnumerable<dynamic>,而这是在运行时评估的动态表达式。请注意getLpVideos(lng)不是函数,它是函数 调用,这意味着它的返回值用作第二个参数而不是功能本身。你需要这个:

var result = CacheService
    .GetObjectFromMemoryCacheWithDefParams(casheName, getLpVideos);

此外,您需要在GetObjectFromMemoryCacheWithDefParams方法中修复您的函数调用 - 它需要一个您不提供的输入参数:

所以改变这个:

return result ?? defGetValueFunc();

到此:

return result ?? defGetValueFunc(key);

答案 1 :(得分:1)

如果我正确理解您的问题,您只需要接听电话即可。在这种情况下 你只需要明确告诉它T是什么类型。在你的情况下是IEnumerable<dynamic>。所以你可以打电话

var result = CacheService.
             GetObjectFromMemoryCacheWithDefParams<IEnumerable<dynamic>>(
                    casheName, 
                    getLpVideos(lng)
             );

答案 2 :(得分:1)

您需要将字符串传递给defGetValueFunc并明确指定T的类型

public T GetObjectFromMemoryCacheWithDefParams<T>(string key, Func<string,T> defGetValueFunc) where T : class
{
  var result = _cache.Get(key) as T;    
  return result ?? defGetValueFunc(*somestring*);
}


var result = CacheService.GetObjectFromMemoryCacheWithDefParams<IEnumerable<dynamic>>(casheName, getLpVideos(lng)  );

答案 3 :(得分:1)

您确定这正是您要编译的代码吗?错误实际上恰好发生在您所说的位置吗?

如果是这样,那么在我看来,您的代码的问题在于您根本没有正确调用委托参数。您正在传递一个委托实例,该实例需要传递一个string参数。但是在您的代码中,您没有传递任何参数:

public T GetObjectFromMemoryCacheWithDefParams<T>(
    string key, Func<string, T> defGetValueFunc) where T : class
{
    var result = _cache.Get(key) as T;

    return result ?? defGetValueFunc(--> you need a parameter here! <--);//here error
}

我不知道你应该传递什么参数,因为你在帖子中包含的匿名方法甚至不使用参数(除了检索被忽略的值) 。但你必须传递一些东西。

我认为这里的类型推断实际上没有任何问题。这个简单的例子,基本上与你的相同(除了我正确地调用委托)编译得很好:

static T Method<T>(string s, Func<string, T> f) where T : class
{
    return f(s);
}

static void OtherMethod()
{
    Func<string, IEnumerable<dynamic>> f = l => new List<object>();

    Method("foo", f);
}

很明显,在给定正确的代码的情况下,编译器可以推断出正确的类型。 :)