Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查TA类型是否可以在运行时强制转换为TB类型?(考虑的不仅仅是继承)_C#_.net_Cil - Fatal编程技术网

C# 检查TA类型是否可以在运行时强制转换为TB类型?(考虑的不仅仅是继承)

C# 检查TA类型是否可以在运行时强制转换为TB类型?(考虑的不仅仅是继承),c#,.net,cil,C#,.net,Cil,所以我知道这是可行的: class A { } class B : A { } [Test] public void CanCast() { Assert.That(typeof(A).IsAssignableFrom(typeof(B))); Assert.That(!typeof(B).IsAssignableFrom(typeof(A))); } 但是,假设这两种类型是Int32和Int64 在运行时,我可以将Int32值强制转换为Int64变量,但反过来

所以我知道这是可行的:

class A
{
}
class B : A
{       
}

[Test]
public void CanCast()
{
    Assert.That(typeof(A).IsAssignableFrom(typeof(B)));
    Assert.That(!typeof(B).IsAssignableFrom(typeof(A)));
}
但是,假设这两种类型是Int32和Int64

在运行时,我可以将Int32值强制转换为Int64变量,但反过来不行。如何在运行时检查这种强制转换兼容性?(IsAssignableFrom不适用于此,它总是为Int32和Int64提供false)


编辑:我不能简单地尝试强制转换,因为我没有这些类型的任何值,我在问一个假设场景,有两个类型A和B,没有两个值A和B。

一个(不太优雅)方法是简单地尝试它-将您的尝试包装在try/catch中,如果捕获到异常,则断言false。

对于非基元类型,您可以反映和检查在支持转换的任一类型上是否存在
op_Implicit
方法。IL实际上不支持真正的运算符重载,因此它纯粹是C#识别运算符重载的约定系统。如果该方法是从C#中的运算符重载定义创建的,则该方法也将标记为IsSpecialName

对于(如Int32和Int64),最简单的选择是硬编码各种情况,因为转换是通过原始IL操作码而不是通过方法进行的。虽然只有少数几个基本类型,所以创建一个检查每个基本类型的所有可能性的方法并不困难


一个旁注由于您的示例特别提到了原语值类型,请注意隐式“转换”(在C#中)的存在并不意味着所有“强制转换”都可以工作。C#cast操作
(T)x
也可以表示“将x中的值取消x到类型T”。如果x包含一个已装箱的Int32,并且您尝试(Int64)x,则此操作将在运行时失败,即使您可以隐式地将Int32“转换”为Int64。请参阅,以获取有关为什么取消装箱会以这种方式工作的更多信息。

真正的问题是:如果无法将Int64强制转换为Int32,在运行时您会怎么做?要么你可以自己解决问题,然后为什么不一直应用这些工作,这样你就不需要费心检查,要么你什么都做不了,然后为什么不让系统抛出异常呢?某些int64值适合int32是否相关?或者您想禁止它,因为它并不总是有效的?您可以将
Int64
强制转换为
Int32
,但它是显式强制转换,而不是隐式强制转换。对于内置类型,允许的显式和隐式转换是特定于语言的,您无法从所讨论的
类型中找到。问题是,你为什么想知道这个?为什么您想在运行时知道C#在编译时是否允许隐式转换?EAFP范例:请求原谅比请求许可更容易。如果例外情况很少,这通常是一个好方法。我没有说我有值,我只有类型。