Tag: 铸造

为什么Linq在使用ToList时失败?

考虑这个琐碎的例子: var foo = new byte[] {246, 127}; var bar = foo.Cast<sbyte>(); var baz = new List<sbyte>(); foreach (var sb in bar) { baz.Add(sb); } foreach (var sb in baz) { Console.WriteLine(sb); } 用Two's Complement的魔法,-10和127被打印到控制台上。 到现在为止还挺好。 敏锐的眼睛的人会看到我遍历一个枚举并将其添加到列表中。 这听起来像ToList : var foo = new byte[] {246, 127}; var bar = foo.Cast<sbyte>(); var baz = bar.ToList(); //Nothing […]

为什么在C#中int 是uint == true“

请有人澄清C#关键字请。 特别是这两个问题: Q1)第5行; 为什么这个回报是真的? Q2)第7行; 为什么没有抛出exception? public void Test() { object intArray = new int[] { -100, -200 }; if (intArray is uint[]) //why does this return true? { uint[] uintArray = (uint[])intArray; //why no class cast exception? for (int x = 0; x < uintArray.Length; x++) { Console.Out.WriteLine(uintArray[x]); } } } MSDN的描述没有说明情况。 它表示,如果满足这些条件中的任何一个,将会返回true。 (http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx>MDSN […]

C / C ++中的types究竟是什么?

C / C ++中的types究竟是什么? 编译器如何检查是否需要明确的types转换(和有效的)? 它是否比较价值所需的空间? 如果我有例如: int a; double b = 15.0; a = (int) b; 如果我没有记错,一个double值需要更多的空间(8个字节?!),而不是一个整数(4个字节)。 而且两者的内在performance是完全不同的(两个/尾数的补充)。 那么内部会发生什么? 这里的例子非常简单,但是在C / C ++中有大量的types转换。 编译器如何知道(或程序员)是否可以将FOO转换为BAR?

如何从List <>投射ArrayList <>

有人可以解释我为什么我不能将第一种方法将List<>为ArrayList<> ,而我使用第二种方法呢? 谢谢。 第一种方法: ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token)); 第二种方法: ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));

正确的方法来投射指针types

考虑下面的代码 (以及VirtualAlloc()返回一个void* )的事实: BYTE* pbNext = reinterpret_cast<BYTE*>( VirtualAlloc(NULL, cbAlloc, MEM_COMMIT, PAGE_READWRITE)); 为什么selectreinterpret_cast而不是static_cast ? 我曾经认为reinterpret_cast是好的例如铸造指针和整数types的指针(如DWORD_PTR ),但从一个void*转换为BYTE* ,是不是static_cast好吗? 在这种特殊情况下是否存在任何(微妙的)差异,还是仅仅是有效的指针转换? C ++标准是否对这种情况有偏好,build议一种方式而不是另一种?

在C#中将代理投射到Func

我有代码: public delegate int SomeDelegate(int p); public static int Inc(int p) { return p + 1; } 我可以把Inc成SomeDelegate或者Func<int, int> : SomeDelegate a = Inc; Func<int, int> b = Inc; 但是我不能把Inc成SomeDelegate ,然后用像这样的常用方法SomeDelegate为Func<int, int> : Func<int, int> c = (Func<int, int>)a; // Сompilation error 我怎么能做到这一点?

qobject_cast如何工作?

我刚刚在Qt中find下面的代码,我有点困惑这里发生了什么。 特别是对于reinterpret_cast<T>(0)是什么? template <class T> inline T qobject_cast(const QObject *object) { // this will cause a compilation error if T is not const register T ptr = static_cast<T>(object); Q_UNUSED(ptr); #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK) reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(const_cast<QObject *>(object))); #endif return static_cast<T>(const_cast<QObject *>(reinterpret_cast<T>(0)->staticMetaObject.cast(const_cast<QObject *>(object)))); } 任何人都在意解释?

在C#中枚举枚举枚举

有一些我在C#中无法理解的东西。 你可以将一个超范围的int转换成一个enum ,编译器不会退缩。 想象一下这个enum : enum Colour { Red = 1, Green = 2, Blue = 3 } 现在,如果你写: Colour eco; eco = (Colour)17; 编译器认为这很好。 运行时也是如此。 呃? 为什么C#团队决定做到这一点? 这个决定忽略了在这种情况下使用枚举的观点: void DoSomethingWithColour(Colour eco) { //do something to eco. } 在像C#这样的强types语言中,我想假设eco将始终保持合法的Colour值。 但这种情况并非如此。 程序员可以调用我的方法,赋值为17(如前面的代码片段),所以我的方法中的代码不能假定eco拥有合法的Colour值。 我需要明确地进行testing,并按照我的要求处理exception值。 为什么是这样? 在我看来,如果在编译时int值超出范围的情况下编译器发出错误(甚至是警告)消息将会好得多。 否则,运行时应该在赋值语句处引发exception。 你怎么看? 这是为什么? (注意,这是我在博客上多年前发布的一个问题,但没有提供任何信息。

为什么这个演员需要布尔?

template<typename InputIterator, typename Predicate> inline InputIterator find_if(InputIterator first, InputIterator last, Predicate pred, input_iterator_tag) { while (first != last && !bool(pred(*first))) ++first; return first; } 我碰到了GCC 4.7.0附带的C ++标准库实现源代码片段 。 这是一个input迭代器的find_if的特化。 我清除了主要的下划线,使其更具可读性。 为什么他们在谓词上使用boolexpression式?

铸造Arrays.asList导致exception:java.util.Arrays $ ArrayList不能转换为java.util.ArrayList

我是新来的Java,并试图了解为什么第一个代码片段不会导致此exception,但第二个。 既然在这两种情况下都将string数组传递给Arrays.asList,那么这两个片段是不是应该产生一个exception呢? Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 第一个片段(不会导致例外): ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>(); String line = "a,b,cdef,g"; String delim = ","; String[] pieces = line.split(delim); stuff.add((ArrayList<String>) Arrays.asList(pieces)); 第二个片段(导致以上例外): ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>(); String[] titles = {"ticker", "grade", "score"}; stuff.add((ArrayList<String>) Arrays.asList(titles)); 如果相关,我在Eclipse Helios中使用JavaSE 1.6。