【发布时间】:2020-05-16 05:52:44
【问题描述】:
如果我运行代码:
object myObject = "abc";
JToken jToken = (JToken)myObject;
它编译得很好,但它会抛出一个神秘的异常标题。这是神秘的,因为可以通过以下编译和正确运行将表单 String 转换为 JToken:
String mystring = "abc";
JToken jToken2 = (JToken)mystring;
所以我很好奇为什么会这样?
当然,上面的例子有点傻,但也许能理解我为什么问这个是因为在下面的情况下也会产生同样的错误。
class Program
public static JToken apply_function(Delegate function, object[] arglist)
{
return (JToken)function.DynamicInvoke(arglist);
}
static void Main(string[] args)
{
Func<string> hello = () => { return "hello world!"; };
Console.WriteLine(apply_function(hello, new object[0]));
}
}
在想要使用apply_function的实际情况中,是我无法控制返回类型或提供给apply_function的Delegate的参数类型的情况。我唯一的保证是,Delegate 将是一个函数,它返回可转换为 JToken 的东西。
【问题讨论】:
-
不要将多个内容放在一行中。返回、强制转换和函数调用是三件事,每件事都会给你编译错误。将代码压缩到一行中的唯一代价就是调试它的时间很长。使用临时/局部变量将代码拆分为多行。不要担心性能 - 在调试构建之外,各种优化会减少未充分利用的变量。