我们可以用其他运算符替换IS运算符吗?

时间:2017-08-18 11:23:55

标签: c#

我们可以将IS运营商功能替换为任何其他运营商或功能或除AS之外的任何其他运营商或功能吗? 我试图像这样替换它

class test
{
Program a = new Program();
ProgramTwo b = new ProgramTwo();
if(a.GetType()?. == b.GetType())
Console.WriteLine("true");
}

但不适用于使用基类检查派生对象的情况,所以任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我不明白你为什么不想使用is。它更加美丽。如果您使用is,则代码通常更清晰。

另一种选择是IsAssignableFrom。 (docs

Console.WriteLine(typeof(object).IsAssignableFrom (5.GetType()));

第二种选择是IsInstanceOfType。 (docs

Console.WriteLine(typeof(object).IsInstanceOfType(5));

以上两者与

类似
Console.WriteLine(5 is object);

看到可读性之间的区别?

答案 1 :(得分:0)

通常认为

IsAssignableFrom 模仿is运算符(具有相反的操作数顺序),但运算符有许多细微差别很难甚至无法实现。看看这段代码:

public static bool TestIs1<T1, T2>()
{
    var arr = new T1[0];
    return arr is T2[];
}

Console.WriteLine(TestIs1<int, uint>());
var arr = new int[0];
Console.WriteLine(arr is uint[]);

如果您没有猜到,输出为&#34; True,False&#34;。为什么?因为这个场合是C#明显不同意CLR的场合。您可以将int数组转换为uint数组,如下所示:(uint[])(object)arr并且CLR将允许您这样做,但如果没有(object)强制转换,编译器会抱怨。相反,编译器不能直接影响泛型方法中的代码如何执行,因此将其留给CLR执行isinst操作码,当然,这将允许它。

正如您所看到的,有时&#34; int[]uint[]&#34;有时它不是,并且这不是你可以用另一种方法轻易复制的东西。如果你想尝试这个,你将不得不处理很多像这样的案件。例如:nulls,nullables,by-ref-like类型( TypedReference RuntimeArgumentHandle ArgIterator 等)。坚持使用语言为您提供的服务会更好。