草庐IT

c# - 为什么 Int32 类型的最大值为 2³¹ − 1?

我知道Int32长度为32位(4字节)。我假设它有2³²个值,但由于其中一半必须小于零,我想这与此有关。我想知道为什么Int32的最大正数是2³¹−1。 最佳答案 这个最高有效位用于对符号进行编码(1表示负数),因此只有31位可用于实际值。Int32.MaxValue=2^31-1=011111111111111111111111111111111=000000000000000000000000000000010=00000000000000000000000000000000-1=111111111111111111111111

c# - "Object cannot be cast from DBNull to other types"

当我的网站执行到以下代码时,它会崩溃并出现如下异常:System.InvalidCastException:ObjectcannotbecastfromDBNulltoothertypes.为了简洁起见,我只展示了相关代码(我得到的是一个4000+LOC文件)。if(dr["STAGE"]isDBNull){dto.Stage=1;//Thisisthelinethrowingtheexception,accordingtostacktrace}else{dto.Stage=Convert.ToInt32(dr["STAGE"]);}这里,dr是一个DataRow对象,它是对数据库的查

c# - 检查对象是否为 C# 中的非特定泛型类型

假设我有以下类(class):publicclassGeneral{}我想知道一个对象是否属于那种类型。我知道我可以使用反射来确定对象是否属于Type.GetGenericTypeDefinition的泛型类型,但我想避免这种情况。是否可以做类似objisGeneral的事情?,或obj.GetType().IsAssignableFrom(typeof(General))?我很惊讶我找不到类似的问题,尽管我可能在搜索中使用了错误的关键字。 最佳答案 你可以这样做:varobj=newGeneral();vartype=obj.Ge

c# - C# 中的 `x is int?` 和 `x is int` 有区别吗?

classCwhereT:struct{boolM1(objecto)=>oisT;boolM2(objecto)=>oisT?;}上面的两种方法在传递null时似乎表现相同引用或盒装T值(value)。但是,生成的MSIL代码有点不同:.methodprivatehidebysiginstanceboolM1(objecto)cilmanaged{.maxstack8IL_0000:ldarg.1IL_0001:isinst!TIL_0006:ldnullIL_0007:cgt.unIL_0009:ret}对比.methodprivatehidebysiginstanceboolM2

c# - 你如何解决类型和对象之间常见的命名冲突?

由于标准的c#约定是将公共(public)属性的首字母大写,旧的c++约定类型名称的首字母大写和非类型名称的首字母小写并不能防止经典名称冲突,其中最明显的对象名称匹配类型名称:classFooManager{publicBarManagerBarManager{get;set;}//Feelsverywrong.//Recommendednamingconvention?publicintDoIt(){//1stand2ndBarManageraredifferentsymbolsreturnBarManager.Blarb+BarManager.StaticBlarb;}}class

c# - 为什么 IsAssignableFrom 在将可空值与接口(interface)进行比较时返回 false?

C#中的以下调用返回false:typeof(IComparable).IsAssignableFrom(typeof(DateTime?))但是,下面这行是完全有效的:IComparablecomparable=(DateTime?)DateTime.Now;为什么会这样?是因为使用Nullable支持可空类型吗?并且第一个通用参数实现接口(interface)的事实并不意味着Nullable类也实现了该接口(interface)?(例如:List不实现Foo实现的接口(interface))编辑:我认为上面的行编译是因为当装箱一个可为null的类型时,只有基础类型被装箱,如此处解释

c# - 没有 assemblyinfo 的通用类型的全名?

我有一个数据库表,用于存储窗口的高度、宽度、状态等。作为窗口的标识符,我使用表单的完整类型名称。它运作良好,但我发现一些通用形式的名称非常长。原因是通用类型列出了完整的程序集信息。有办法跳过吗?例如,常规表单的全名如下所示:Some.Name.Space.NameOfForm但是通用表单的全名如下所示:Some.Name.Space.NameOfForm`1[[Some.Other.Name.Space.GenericType,AssemblyName,Version=1.0.2.0,Cuntulre=neutral,PublicKeyToken=null]]为什么这么长?有什么办法可

c# - 如何确定 System.Type 是自定义类型还是框架类型?

我想清楚地确定我拥有的类型是自定义类类型(MyClass)还是框架提供的类型(System.String)。有什么方法可以将我的类类型与system.string或其他框架提供的类型区分开来吗? 最佳答案 安全检查类型是否属于程序集的唯一方法是检查程序集的完全限定名称,其中包含其名称、版本、区域性和公钥(如果已签名)。所有.Net基类库(BCL)均由Microsoft使用其私钥签名。这使得其他任何人几乎不可能创建与基类库具有相同完全限定名称的程序集。//addmore.NetBCLnamesasnecessaryvarsystemN

c# - 在 C# 中的数据类型之间进行转换

我有(例如)一个A类型的对象,我希望能够将其转换为B类型(类似于将int转换为float)数据类型A和B是我自己的。是否可以定义此转换发生的规则?示例inta=1;floatb=(float)a;intc=(int)b; 最佳答案 是的,这可以使用C#运算符重载。有两个版本explicit和implicit.这是一个完整的例子:classProgram{staticvoidMain(string[]args){Aa1=newA(1);Bb1=a1;Bb2=newB(1.1);Aa2=(A)b2;}}classA{publicintF

c# - 通用类型类型转换方法(.Net)

我正在尝试创建一个通用方法来转换对象,但似乎无法解决这个问题。(今天是星期五下午3点,这是漫长的一周)好的,所以我有这个场景://Wehaveavalue(which.netsetsasadoublebydefault)objectobj=1.0;//Wehavethetargettypeasastring,whichcouldbeanything://saystringsometType="System.Decimal"Typetype=Type.GetType(someType);//IneedagenericwayofcastingthisobjectcastedObj=(xxx