C#中的Is和As关键字

时间:2017-04-17 13:06:34

标签: c# asp.net casting

我想了解is

asC#关键字之间的区别

谷歌搜索&阅读一些文章,我得到了如下理解: -

  • is检查给定对象的类型是否与新对象类型兼容。这是一个布尔类型..返回true或false

  • as检查给定对象的类型是否与新对象类型兼容。如果给定对象与新对象兼容,则返回非null,否则返回null ..这会引发异常。

所以下面这个我试着。

class Customer
{

}

class Client
{

}

Main()
{
  Customer cu = new Customer();  
  Client cl = new Client();

 //usage of is 

  var flag = cu is Customer;
  Console.Writeline(flag); //true

 flag = cu is Client;
 Console.writeline(flag); // false

//usage of as
var obj = cu as Customer; 
Console.writeline(obj);


//on the below statement, I was expecting an exception on run time.
 var obj1 = cu as Client;
 //#checkPoint but the above line is giving me Compile time error.

}

对我来说,为什么我在 #checkPoint 上收到编译时错误而不是基于我的理解我期待运行时错误,因为customerObj(cu)与Client不兼容,这听起来很混乱。

任何建议都受到高度赞赏。

4 个答案:

答案 0 :(得分:2)

规范定义obj as T形式的强制转换有效时:

7.10.11 as运算符

  

标识(第6.1.1节),隐式可空(第6.1.4节),隐式引用   (§6.1.6),拳击(§6.1.7),显式可空(§6.2.3),显式   从E到,存在引用(第6.2.4节)或拆箱(第6.2.5节)转换   吨。

var obj1 = cu as Client;

没有隐式转化,因此您需要在cuClient之间进行明确的引用转化。

规范定义了显式引用转换:

6.2.4明确的引用转换

  • 从对象和动态到任何其他引用类型。
  • 从任何class-typeS到任何class-typeT,只要S是T的基类。

这些都不适用,因此演员表无效。最简单的解决方法是将cu的类型更改为object:

object cu = new Customer();

在运行时cu as Client将评估为null

答案 1 :(得分:1)

它会给您一个编译时错误,因为obj的类型为Customer,而来自cu as Client的任何内容都属于Client类型。

即使您分配给Client类型的变量,也不会在运行时获得异常。你自己引用了它:

  

else null

只会产生null

答案 2 :(得分:1)

当你说var obj = cu as Client时,你基本上试图将cu实例强制转换为Client,并且因为它不是从Client继承的,所以它会返回null。

为用例提供此示例更方便:

假设您的基类为BaseClass

public abstract class BaseClass
    {
        protected BaseClass()
        {
        }
    }

并且假设您有两种类型派生自BaseClassSub1Sub2

public class Sub1 : BaseClass {

}

public class Sub2 : BaseClass {

}

你在某个地方有一个方法,它接受一个BaseClass对象并根据它的子类做一些指令。

private void Method(BaseClass base) {
     var sub1 = base as Sub1;
     var sub2 = base as Sub2;

     if(sub1 != null) {
           // do something specific
     }
     if(sub2 != null) {
           // do something specific
     }
     else
          throw new SubTypeIsNotSupportedException();
}

但是is仅用于检查实例类型。

if(anInstance is Sub1) {
     Console.WriteLine("It is Sub1!");
}
if(anInstance is Sub2) {
     Console.WriteLine("It is Sub2!");
}
else {
     Console.WriteLine("I don't know what it is!");
}

答案 3 :(得分:0)

你有没有试过施展你的" cu"在一个动态对象?

 static void Main(string[] args)
    {


        Customer cu = new Customer();
        Client cl = new Client();

        //usage of is 

        var flag = cu is Customer;
        Console.WriteLine(flag); //true

        flag = cu is Client;
        Console.WriteLine(flag); // false

        //convert it to a dynamic object
        dynamic obj = cu;

        //usage of as
        var obj1 = obj as Customer;
        Console.WriteLine(obj);


        //on the below statement, I was expecting an exception on run time.#
        var obj2 = obj as Client;
        Console.WriteLine(obj2);            // <-- this is null!!

        //#checkPoint but the above line is giving me Compile time error.


        Console.ReadKey();

    }

&#34; obj2&#34;运行此代码后,将为null,没有例外。

为什么这样做以及为什么你的代码不起作用,我不知道。我认为它基于&#34; as&#34;的实施。如果您使用&#34; as&#34;声明,然后检查背后的方法,该类是否可浇铸,在您的情况下,&#34; as&#34;方法知道,它不是可投射的,并且抛出了一个例外。但是如果将它转换为动态对象,则在使用&#34; as&#34;之前,后面的方法无法检查它并返回null。