为什么在C#中用sbyte铸造大的双倍值会返回0?
我实际上在未检查的上下文中测试了C#中的铸造行为.就像文档所说的那样,在未经检查的情况下,演员阵容总是成功的.但是有时在尤其是从一种特定类型到另一种类型的铸件会产生意外结果. 例如,我测试了三个" double to sbyte"演员: var firstCast = (sbyte) -129.83297462979882752; // Result : 127. var secondCast = (sbyte) -65324678217.74282742874973267; // Result : 0. var thirdCast = (sbyte) -65324678216.74282742874973267; // Result : 0. 要清楚,第二个双重和第三个双只有1(secondDouble - firstDouble = 1)之间的差异. 在这种情况下,对于任何"大"双重值,铸造的结果似乎总是0. 我的问题是:为什么第二个和第三个
0 2024-04-16
编程技术问答社区
当把一个字母类型化为一个int时,C#会做什么?
我们必须为外部接口实现加密.该接口的所有者提供了有关如何在我们这边进行相同加密的文档.但是,此文档在C#中,我们在Php中工作. 我们理解的大多数部分除了它们似乎在int上输入hash的位置.他们的代码读取: // hashString exists and is a md5 a like string int[] keyBuffer = new int[hashString.length]; for (int i=0; i
0 2024-04-16
编程技术问答社区
运行时的动态铸造
是否有一种在运行时动态施放的方法,例如以下伪代码: foreach (DataRow row in table.Rows) { foreach (DataColumn col in table.Columns) { if (row[col] != DBNull.Value) { Type type = col.DataType; type cellContent = (type)row[col]; //Pseudo-Code } } } 我一直在搜索网络,没有找到任何东西.有object obj = Activator.CreateInstance(type);,但是然后我仍然陷入了一个对象,并且可以使用特定的类型方法.另外,我需要一个现有对象而不是新实例.在某些情况下,我需要从细胞结构中删除所有EventHandlers,例如它们会导致内存泄漏,例如:对象
0 2024-04-16
编程技术问答社区
什么是物体铸造?
我对确切的对象铸造以及它的使用方式有些困惑. 我已经阅读了有关 conversion "> casting和casting ">键入转换,我可以看到为了明确的转换,您需要使用铸造操作员.我了解文档中给出的示例,即如果将一种类型转换为另一种类型时可能会丢失一些数据,则需要使用铸造操作员. 我只是对您如何施放对象感到困惑?我假设对象是类的实例,它可能拥有更多信息,而不仅仅是简单的数据类型?那么如何,为什么以及何时需要施放对象? 我已经看到了施放对象的示例,这简直就是: SomeType name = (SomeType)obj; 我错过了什么,还是这个对象铸造?如果是,在哪种情况下,您需要施放这样的对象? 解决方案 当没有 intimit cast可用的cons -conderer可以验证是安全的时,您只需要使用铸件操作员.如果有一个并且编译器确定演员会成功,那么它将为您自动做到. 现在,为什么要使用演员?您应该使用演员: 具有类型A的对象,您需要一
0 2024-04-16
编程技术问答社区
铸造到接口
我没有在代码中遇到任何错误,但是我的过滤对象始终为空.当我运行调试器时,过滤器对象看起来像排序对象,其中包含东西的列表.虽然您可以看到它实际上是一个接口..我需要更改此代码以访问过滤器中的信息?我想我的主要问题是我不完全掌握如何使用界面. public IList Filters { get; set; } public IList Sorts { get; set; } List sort = request.Sorts as List; if(sort.Count == 1) { pRequest.SortMember = sort[0].Member; pRequest.SortDirection = (int)sort[0].SortDirection; } List
0 2024-04-16
编程技术问答社区
将ListBox.SelectedObjectCollection投给ListBox.ObjectCollection?
是否可以将listBox.SelectedObjectCollection施放到C#中的ListBox.ObjectCollection?如果是这样,我将如何处理? 解决方案 我具有接受List的函数. 我可以通过施放选定的项目和项目. 尝试以下操作: SelectedItems.Cast().ToList() Items.Cast().ToList() 可以用其他对象类型替换. 其他解决方案 这是不可能的. 相反,您应该使用IList. 这两种类型都实现了IList,因此您可以将其作为IList传递而无需任何明确的铸造. 如果您真的想要,可以创建一个新的ListBox.ObjectCollection并添加SelectedObjectCollection. 的项目 其他解决方案 这是我的答案:它对我有用. System.Windows.Forms.ListBo
0 2024-04-16
编程技术问答社区
为什么这种转换不起作用?
以下代码行为奇怪(至少对我来说): int testValue = 1234; this.ConversionTest( testValue ); private void ConversionTest( object value ) { long val_1 = (long) (int) value; // works long val_2 = (long) value; // InvalidCastException } 我不明白为什么直接施放长期不起作用. 有人可以解释这种行为吗? 谢谢 解决方案 ConversionTest方法的参数键入为object;这意味着任何值类型(例如int)都将被装箱. . 盒装值只能将其拆箱到完全相同的类型: 当您做(long)(int)value时,您是第一次将value拆开int(其原始类型),然后将int转换为long. 当您做(long)value时,您正在尝试将盒装in
0 2024-04-16
编程技术问答社区
用千分离器错误施放varchar到十进制
今天,我想知道为什么这些简单的SQL语句返回错误而不是成功执行: GO SELECT CAST('1,234.00' AS DECIMAL(22,2)) GO SELECT CONVERT(DECIMAL(22,2), '1,234.00') 如果我删除了千分隔符,我发现脚本已成功执行. GO SELECT CAST('1234.00' AS DECIMAL(22,2)) GO SELECT CONVERT(DECIMAL(22,2), '1234.00') 因此,问题是为什么SQL Server不接受千分离器作为输入? 此外,我发现同一逻辑在C#. 中成功执行 static void Main(string[] args) { string s = "1,234.00"; Console.WriteLine(decimal.Parse(s)); // result 1234.00 } 为什么他们对铸造对象有不同的策略?我已经验证了C#的
0 2024-04-16
编程技术问答社区
在C#中,是否有可能在不创建新数组的情况下将一个字节数组投到另一个类型?
我有一个字节[]对象,我用作数据缓冲区. 我想将其"读"为原始/非启示结构的数组,而不复制内存中的字节[]数据. 目标将是: byte[] myBuffer; //Buffer is populated int[] asInts = PixieDust_ToInt(myBuffer); MyStruct[] asMyStructs = PixieDust_ToMyStruct(myBuffer); 这可能吗?如果是这样,如何? 解决方案 有可能吗?实际上,是! 自.NET CORE 2.1,MemoryMarshal以来,让我们可以为跨度执行此操作.如果您对跨度而不是数组感到满意,则是. var intSpan = MemoryMarshal.Cast(myByteArray.AsSpan()); int跨度将包含bytecount/4整数. 至于自定义结构...该文档声称在转换两侧需要"原始类型".但是,您可
0 2024-04-16
编程技术问答社区
C#性能分析--如何计算CPU周期?
这是进行绩效分析的有效方法吗?我想获得纳秒准确性并确定打字的性能: class PerformanceTest { static double last = 0.0; static List numericGenericData = new List(); static List numericTypedData = new List(); static void Main(string[] args) { double totalWithCasting = 0.0; double totalWithoutCasting = 0.0; for (double d = 0.0; d
0 2024-04-16
编程技术问答社区
为什么降频器在运行时失败
我想知道为什么下面的降落失败 @运行时间: 案例1: Object y = 10.23; Console.WriteLine(y.GetType()); //System.Double int z = (int)y;// fails @ runtime Console.ReadKey(); 案例2: Double y = 10.23; Console.WriteLine(y.GetType());//System.Double int z = (int)y;//success Console.ReadKey(); 在这两种情况下 解决方案 在第一个示例中;拆箱(您显示的内容)是不同的降低或转换;不幸的是,c#使用同一语法为所有3个. 您必须正确 unbox值(例如int/double).或使用具有此嵌入的逻辑的Convert.ToInt32(y). 在第二个示例中,这是一个转换(不是unbox,而不是降低).转换是在语言规范中定义的(例如在这种情
0 2024-04-16
编程技术问答社区
为什么Dictionary<T1, List<T2>>不能被转换为Dictionary<T1, IEnumerable<T2>>?
我想知道为什么我不能只是施放(我有一个模糊的想法,这可能与该co/cor违反的东西有关吗?),我是否被迫将第一个字典的元素复制到新的为了获得我想要的类型? 解决方案 您不能这样做,因为它们不是同一类型.考虑: var x = new Dictionary>(); // won't compile, but assume it could... Dictionary> xPrime = x; // uh oh, would allow us to legally add array of int! xPrime["Hi"] = new int[13]; 这有意义吗?因为Dictionary>表示TValue是List,这意味着您可以Add() a List
0 2024-04-16
编程技术问答社区
linq .Cast<>或者在ConvertAll里面对一个列表进行投掷。
认为您必须将List类型的mylist转换为List其中T是Base 的子类 这些解决方案是一样的吗?哪些表现更好,为什么? 我什么时候应该使用第一个或第二个? return mylist.Cast().ToList(); return mylist.ConvertAll(x => (Base)x); 也许第二个解决方案可能会更好,因为myList是直接转换的. 在第一个解决方案中,列表转换为iEnumerable,然后列出,但我不确定. 解决方案 tl; dr:ConvertAll进行1个内存分配,但在大多数情况下.Cast.ToList多个. 大多数linq扩展(例如.Cast())导致延期执行IEnumerable无法将其施加到ICollection(无法获得结果的). 可以将结果施加到ICollection时, .ToArray .ToArray .ToArray .ToArray .
0 2024-04-16
编程技术问答社区
C#-将一个字节数组转换为一个结构数组,反之亦然(反向)。
我想将颜色[]保存到文件.为此,我发现使用" system.io.file.writeallbytes"将字节数组保存到文件应该非常有效. 我想将我的颜色[](struct的阵列)施加到一个字节阵列中,以确保以下方式: Little Endian/Big Endian的潜在问题(我认为不可能发生但想确定) 有2个不同的指针指向相同的内存,该记忆指向不同的类型.垃圾收集会知道该怎么做 - 移动对象 - 删除指针吗? 如果可能的话,有一种通用方法将字节数组施放到任何struct(t struct)和vice-ives-a的数组. . 如果不可能,为什么? 谢谢 埃里克 我认为那两种解决方案会制作一个我想避免的副本,而且它们都使用元帅.ptrtoStructure,它特定于结构,而不是结构的数组: 阅读c/c/c ++数据结构在字节数组中的C#中 如何将结构转换为结构字节数组在C#? 中 解决方案 关于数组类型conversion
0 2024-04-16
编程技术问答社区
如何确定枚举值的代表类型?
考虑以下两个枚举: enum MyEnum1 { Value1 = 1, Value2 = 2, Value3 = 3 } enum MyEnum2 { Value1 = 'a', Value2 = 'b', Value3 = 'c' } 我可以通过显式铸造来检索这些枚举值表示的物理价值,((int)MyEnum1.Value2) == 2或((char)MyEnum2.Value2) == 'b',但是如果我想在不首先知道要铸造的类型的情况下获得char表示或int表示呢? 是否可以在没有铸件的情况下获得枚举的基本价值,或者至少在程序上可以确定基础值的正确类型? 解决方案 这两个枚举的基础值均为int.您只是使用以下事实:在第二种情况下,从char到int有隐性转换. 例如,如果您查看反射器中的第二个枚举,您会看到类似的东西: internal enum MyEnum2 { Value1
0 2024-04-16
编程技术问答社区
(类型)objectname.var中的(类型)是什么?
我正在浏览一本关于C#的书,并且遇到了我似乎无法抬头的东西,因为我不知道它叫什么,或者试图通过描述搜索某些东西. 有些人可以向我解释发生了什么事,或者像(int)objectname.variablename中对对象之前发生的(type)背后的含义? 似乎对我施放. 编辑: 由于你们中的大多数人都在猜测时就"我的"铸造,而且需要更多代码,因此我包括我正在审查的代码带来了这个问题.我正在质疑(int)numericupdown1.value; 中的(int) private void numericUpDown1_ValueChanged(object sender, EventArgs e) { dinnerParty.NumberOfPeople = (int)numericUpDown1.Value; DisplayDinnerPartyCost(); } 解决方案 它正在铸造(转换)numericupdown1.值为int值.这也可以使
0 2024-04-15
编程技术问答社区
在接口签名相同的接口之间铸造
当两个接口的签名相同时,是否可以从一个接口到另一个接口?以下来源给出了Unable to cast object of type 'ConsoleApplication1.First' to type 'ConsoleApplication1.ISecond'.异常. class Program { static void Main(string[] args) { IFirst x = new First(); ISecond y = (ISecond)x; y.DoSomething(); } } public interface IFirst { string DoSomething(); } public class First : IFirst { public string DoSomething() { return "done"; } } p
0 2024-04-15
编程技术问答社区
字符串值到字节数组,无需转换
我试图将字符串的值放入一个字节数组中,并没有更改字符.这是因为字符串实际上是数据的字节表示. 目标是将输入字符串移至字节数组,然后使用以下方式转换字节数组 string result = System.Text.Encoding.UTF8.GetString(data); 我希望有人可以帮助我,尽管我知道这不是一个很好的描述. 编辑: 也许我应该解释说,我正在处理的是一个简单的窗口表单,其中有一个文本框,用户可以将编码的数据复制到其中,然后单击预览以查看解码数据. 编辑: 更多代码: (inputText是一个文本框) private void button1_Click(object sender, EventArgs e) { string inputString = this.inputText.Text; byte[] input = new byte[inputString.Length];
0 2024-04-15
编程技术问答社区
在运行时将List<object>转换为List<T>。
i'M试图构建DI容器,然后我偶然发现了以下问题:我有一种检索给定类型的注册实例列表的方法,我想用它来注入IEnumerable properties在给定的对象中.我想实现的示例将是以下内容: class A { public IList Objects { get; set; } } class B: IExample {} class C: IExample {} Container.Register(new B()); Container.Register(new C()); var obj = new A(); Container.Inject(A); Debug.Assert(A.Objects != null && A.Objects.Count == 2); 我的Retrieve方法返回IList,主要是因为我当时没有类型的信息,因此我试图在注射时间将该列表转换为List.这
0 2024-04-15
编程技术问答社区
在C#中,如何将UIntPtr对象转换为IntPtr?
我需要将UIntPtr对象转换为我的C#.NET 2.0应用程序中的对象.如何实现?我不认为这很简单: UIntPtr _myUIntPtr = /* Some initializer value. */ object _myObject = (object)_myUIntPtr; IntPtr _myIntPtr = (IntPtr)_myObject; 解决方案 这应该在x86和x64 上使用 IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr); 其他解决方案 这应该在32位操作系统上使用: IntPtr intPtr = (IntPtr)(int)(uint)uintPtr; 也就是说,将UINTPTR变成UINT,将其转换为INT,然后将其转换为INTPTR. 差异很大,抖动会优化所有转换,然后将其直接转换为一个值的直接分配给另一个值,但我实际上并未对其进行测试. 请参阅Jar
0 2024-04-15
编程技术问答社区