C#"as"关键字还有比简单投射更多的东西吗?

Edw*_*uay 11 c# casting

我正在研究Josh Smith的CommandSink代码,显然不了解C#中的"as"关键字.

我不明白他为什么写这条线:

IsValid = _fe != null || _fce != null;
Run Code Online (Sandbox Code Playgroud)

因为他只需要写:

IsValid = depObj != null;
Run Code Online (Sandbox Code Playgroud)

既然永远不会出现这种情况,_fe将为null而_fce不为null,反之亦然,对吧?或者我错过了关于"as"如何投射变量的内容?

class CommonElement
{
    readonly FrameworkElement _fe;
    readonly FrameworkContentElement _fce;

    public readonly bool IsValid;

    public CommonElement(DependencyObject depObj)
    {
        _fe = depObj as FrameworkElement;
        _fce = depObj as FrameworkContentElement;

        IsValid = _fe != null || _fce != null;
    }
    ...
Run Code Online (Sandbox Code Playgroud)

回答:

答案就是Marc在他的评论中所说的" 这就是"作为"的全部内容 - 它不会引发异常 - 它只会报告为空."

这是证据:

using System;

namespace TestAs234
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            Employee employee = new Employee();

            Person.Test(customer);
            Person.Test(employee);
            Console.ReadLine();
        }

    }

    class Person
    {
        public static void Test(object obj)
        {
            Person person = obj as Customer;

            if (person == null)
            {
                Console.WriteLine("person is null");
            }
            else
            {
                Console.WriteLine("person is of type {0}", obj.GetType());
            }
        }
    }

    class Customer : Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    class Employee : Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ead 26

as如果操作数兼容,将返回您请求的类型的对象.如果不是,它将返回null.如果您使用as并且演员表可能会失败,您需要检查以确保参考有效.

例如,如果depObj属于类型String,则不会null,但它也无法转换为任何一个请求的类型,并且这两个变量都将变为null.

  • @Gordon - 这就是"as"的重点 - 它*不会*抛出异常 - 它只报告null. (7认同)

pet*_*hen 5

就像"施放,如果是"一样,相当于:

(X is TYPE) ? (TYPE) X : null

然而,它比is+ 更有效cast.

depObj可以实现interface,none或两者.