我们可以将IS
运营商功能替换为任何其他运营商或功能或除AS之外的任何其他运营商或功能吗?
我试图像这样替换它
class test
{
Program a = new Program();
ProgramTwo b = new ProgramTwo();
if(a.GetType()?. == b.GetType())
Console.WriteLine("true");
}
但不适用于使用基类检查派生对象的情况,所以任何人都可以帮我解决这个问题吗?
答案 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 等)。坚持使用语言为您提供的服务会更好。