一、方法中传入的参数为dynamic,则返回的也是dynamic类型
例如:
public string Test(string str)
{
return str + "aa";
}
dynamic t = "";
var t1 = Test(t);
t1的类型为
那假如我们再重构Test
public string Test(dynamic str)
{
return str + "bb";
}
结果会是一样,"11aa",因为在执行的时候t被解析为string类型,会调用第一个方法。
我们重新定义t变量
dynamic t = ;
var t1 = Test(t);
这个时候结果"11bb",但是返回类型仍然是dynamic,即使我们已经重构了参数为 dynamic的方法,单返回的结果仍然不是string类型,而是dynamic。
二、dynamic类型无法使用本身类型的扩展方法。例如,上面实例返回的结果虽然是dynamic类型,然而在解析的时候会当作string类型来处理,但是,dynamic无法使用string类型的扩展方法。
例如:
public static bool IsNotNullOrEmpty(this string str)
{
return str == null || str == "";
}
var t2 = t.IsNotNullOrEmpty();
会引发异常,string未包含IsNotNullOrEmpty()的定义。其实string是包含了IsNotNullOrEmpty() 的方法的,只是该类型为dynamic类型,在解析的时候才是string类型,这样是不能使用扩展的方法的。
那么是否可以为dynamic写一个扩展方法,实现上述功能呢,其实也不行。dynamic类型暂时不支持扩展方法。
当然仅仅只要实现功能可以自定义一个方法。
public static bool IsNotNullOrEmpty(dynamic dyn)
{
return dyn == null || dyn == "";
}
虽然dynamic无法使用本来类型的扩展方法,但是可以使用自带的方法。
var t2 =t.Replace('', '');
结果如下,同理一,自带方法的返回结果仍然是dynamic类型。如果明确类型的,可以自己强类型转换一下就好了。
总结:
1. 对于没有对结果进行类型转换的方法,如果参数传的dynamic类型,那么结果也是dynamic类型,不管你是否定义了dynamic的返回类型和传入参数。
2. dynamic无法使用本身类型的扩展方法。例如dynamic{string}无法使用string的扩展方法。
3. dynamic可以使用本身类型的自带方法。例如dynamic{string}可以使用string.Repalce()方法,但是vs不提供联想,需要自己补全。