我想了解is
as
和C#
关键字之间的区别
谷歌搜索&阅读一些文章,我得到了如下理解: -
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不兼容,这听起来很混乱。
任何建议都受到高度赞赏。
答案 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;
没有隐式转化,因此您需要在cu
和Client
之间进行明确的引用转化。
规范定义了显式引用转换:
6.2.4明确的引用转换
这些都不适用,因此演员表无效。最简单的解决方法是将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()
{
}
}
并且假设您有两种类型派生自BaseClass
,Sub1
和Sub2
:
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。