zoukankan      html  css  js  c++  java
  • dynamic不能使用扩展方法

    一、方法中传入的参数为dynamic,则返回的也是dynamic类型

    例如:

        public  string Test(string str)
        {
            return str + "aa";
        }
        dynamic t = "11";
        var t1 = Test(t);

    t1的类型为

     那假如我们再重构Test

        public string Test(dynamic str)
        {
            return str + "bb";
        }

    结果会是一样,"11aa",因为在执行的时候t被解析为string类型,会调用第一个方法。

    我们重新定义t变量

        dynamic t = 11;
        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('1', '2');

    结果如下,同理一,自带方法的返回结果仍然是dynamic类型。如果明确类型的,可以自己强类型转换一下就好了。

    总结:

    1. 对于没有对结果进行类型转换的方法,如果参数传的dynamic类型,那么结果也是dynamic类型,不管你是否定义了dynamic的返回类型和传入参数。

    2. dynamic无法使用本身类型的扩展方法。例如dynamic{string}无法使用string的扩展方法。

    3. dynamic可以使用本身类型的自带方法。例如dynamic{string}可以使用string.Repalce()方法,但是vs不提供联想,需要自己补全。

  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/fancyblogs/p/7232949.html
Copyright © 2011-2022 走看看