sender as BackgroundWorker 和(BackgroundWorker)sender 有什么不一样吗?为什么用(BackgroundWorker)sender 会错.sender as BackgroundWorker则不会

解决方案 »

  1.   

    用于在兼容的引用类型之间执行转换。例如: 复制代码
    string s = someObject as string;
    if (s != null)
    {
        // someObject is a string.
    } 备注 
    as 运算符类似于强制转换操作;但是,如果转换不可行,as 会返回 null 而不是引发异常。更严格地说,这种形式的表达式expression as type等效于 expression is type ? (type)expression : (type)null只是 expression 只被计算一次。注意,as 运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用 cast 表达式来执行。// cs_keyword_as.cs
    // The as operator.
    using System;
    class Class1
    {
    }class Class2
    {
    }class MainClass
    {
        static void Main()
        {
            object[] objArray = new object[6];
            objArray[0] = new Class1();
            objArray[1] = new Class2();
            objArray[2] = "hello";
            objArray[3] = 123;
            objArray[4] = 123.4;
            objArray[5] = null;        for (int i = 0; i < objArray.Length; ++i)
            {
                string s = objArray[i] as string;
                Console.Write("{0}:", i);
                if (s != null)
                {
                    Console.WriteLine("'" + s + "'");
                }
                else
                {
                    Console.WriteLine("not a string");
                }
            }
        }
    }
      

  2.   

    输出
    0:not a string
    1:not a string
    2:'hello'
    3:not a string
    4:not a string
    5:not a string
      

  3.   

    (BackgroundWorker)sender这是强制转换,如果sender为null或类型不能转为BackgroundWorker就会异常。
    sender as BackgroundWorker,如果sender能转成BackgroundWorker则转,不能转或sender为null就返回null。
      

  4.   

    as 运算符类似于强制转换,所不同的是,当转换失败时,运算符将产生空,而不是引发异常。
    as等同于:
    expression is type ? (type)expression : (type)null
    as 运算符只执行引用转换和装箱转换。
    as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用 cast 表达式来执行这是MSDN的解释,现在你该明白为什么了吧
      

  5.   

    sender as BackgroundWorker比较好,(BackgroundWorker)sender有可能抛出InvalidCast异常。BackgroundWorker worker = sender as BackgroundWorker;
    等价于以下代码,但效率更高:
    BackgroundWorker worker = null;
    if(sender is BackgroundWorker)
    {
      worker = (BackgroundWorker)sender;
    }