C# 原因解析C“Espression表示“类型参数”,其中需要“变量”、“值”或“类型”
我有以下代码在我的C泛型函数中产生编译问题:C# 原因解析C“Espression表示“类型参数”,其中需要“变量”、“值”或“类型”,c#,generics,C#,Generics,我有以下代码在我的C泛型函数中产生编译问题: static void solve () { int[] vals = RA<int>(); } 社区能否帮助我调试或理解这个问题并解决它?您必须重新考虑这个问题-您不能对类型参数调用静态方法。首先,编译器无法在编译时解析它们。有关更多详细信息,请参阅 您可能希望将其更改为以下内容: static T[] RA<T>(Func<string, T> projection) { return RL(
static void solve () {
int[] vals = RA<int>();
}
社区能否帮助我调试或理解这个问题并解决它?您必须重新考虑这个问题-您不能对类型参数调用静态方法。首先,编译器无法在编译时解析它们。有关更多详细信息,请参阅 您可能希望将其更改为以下内容:
static T[] RA<T>(Func<string, T> projection)
{
return RL().Split().Select(projection).ToArray();
}
您可以尝试用System.Convert.ChangeTypev、typeofT替换T.Parse v,但这可能意味着可能存在无效的异常。编译器在编译时不知道结果类型,并且无法链接Parse调用 您应该使用Convert类来避免编译问题并限制泛型类型属性
static T[] RA<T>()
where T : IConvertible
{
return RL().Split().Select(v => (T)Convert.ChangeType(v, typeof(T))).ToArray();
}
你能详细说明你想用这个表达式链做什么吗?@linkerro我需要从文件中读出一行数字。某处数字是双精度的,某处整数等等。所以我想为这个创建一个方法。RL表示控制台。ReadLine@YatsukoYin:那你为什么不包括Console.ReadLine呢?为什么要无缘无故地引入一个令人困惑的名称?@YatsukoYin对于Jon的函数,你可以像RAint.Parse或RAdouble那样调用它。Parse@YatsukoYin:那么这些是您真正的方法和类型名称?RA、RL和solve?我强烈建议您考虑一下可能会在您之后出现的人-写下有意义的名字并遵循.NET命名约定。@JonSkeet不是真的,我正在使用这个模板解决acm.timus.ru、codeforces.com等上的问题。因此,别担心=您还需要将ChangeType的结果转换为谢谢!这正是我要找的!
static T[] RA<T>(Func<string, T> projection)
{
return RL().Split().Select(projection).ToArray();
}
static T[] RA<T>()
where T : IConvertible
{
return RL().Split().Select(v => (T)Convert.ChangeType(v, typeof(T))).ToArray();
}