为什么在C#switch语句中,对于在多个情况下使用的variables,只能在第一种情况下声明它? 例如,下面的代码会引发错误“在这个范围中已经定义了一个名为'variables'的局部variables”。 switch (Type) { case Type.A: string variable = "x"; break; case Type.B: string variable = "y"; break; } 但是,根据逻辑,如果types是Type.B则不应该命中初始声明。 switch语句中的所有variables是否存在于单个作用域中,并且在处理任何逻辑之前是否创build/分配了这些variables?
使用.NET 3.5 我想确定当前时间是否在一个时间范围内。 到目前为止,我有这个机会: DateTime currentTime = new DateTime(); currentTime.TimeOfDay; 我正在消除如何获得时间范围转换和比较。 这会工作吗? if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay && Convert.ToDateTime("13:01") >= currentTime.TimeOfDay) { //match found } UPDATE1:谢谢大家的build议。 我不熟悉TimeSpanfunction。
我使用Visual Studio 2010 C ++和我的项目生成没有错误,但是当我运行它,我得到这个。 我在Windows XP上。 'Shaders.exe': Loaded 'C:\Documents and Settings\User\My Documents\Visual Studio 2010\Projects\Shaders\Win32\Debug\Shaders.exe', Symbols loaded. 'Shaders.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file 'Shaders.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file 'Shaders.exe': Loaded 'C:\qt-everywhere-opensource-src-4.8.3\bin\QtCored4.dll', Symbols loaded. 'Shaders.exe': Loaded 'C:\WINDOWS\system32\user32.dll', Cannot find or open the PDB file 'Shaders.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', […]
我读了一些关于volatile关键字的文章,但我无法弄清楚它的正确用法。 你能告诉我应该在C#和Java中使用什么?
我熟悉C和C ++的语法是上下文敏感的 ,特别是你需要在C中使用“词法分析器”。另一方面,我的印象是,你可以只用Java来parsing尽pipe这两种语言之间有相当的相似性,但它们还是有前瞻性的。 你需要改变一些关于C来使它更容易parsing的东西? 我问,因为所有我看过的关于C语境的例子在技术上是可以允许的,但是很奇怪。 例如, foo (a); 可以用参数a调用void函数foo 。 或者,它可以被声明a footypes的一个对象,但是你可以轻松地摆脱这些缺点。 部分原因是由于C语法的“直接声明者”生成规则实现了声明函数和variables的双重目的,所以出现了这种怪异现象。 另一方面, Java语法对于variables声明和函数声明分别具有生产规则。 如果你写 foo a; 那么你知道这是一个variables声明,而且foo可以毫不含糊地被parsing为一个types名称。 如果foo类没有在当前作用域的某个地方被定义,那么这可能不是有效的代码,但是这是语义分析的一个工作,可以在稍后的编译器中执行。 我已经看到它说C因为typedef很难parsing,但是你也可以在Java中声明你自己的types。 除了direct_declarator之外,哪些C语法规则是错误的?
使用强命名的程序集的优点是什么? 常规assembly不能完成的事情是什么?
有些场合我想用扩展方法重写类中的方法。 有没有办法在C#中做到这一点? 例如: public static class StringExtension { public static int GetHashCode(this string inStr) { return MyHash(inStr); } } 我想这样做的一个例子是能够将一个string的散列存储到数据库中,并且所有使用string类的散列的类(即字典等)都使用相同的值。由于内置.Net哈希algorithm不保证从一个版本的框架兼容到下一个,我想用我自己的replace它。 还有其他的情况,我已经跑到了我想用一个扩展方法重写一个类方法,所以它不只是特定于string类或GetHashCode方法。 我知道我可以通过inheritance现有的类来实现这一点,但是在很多情况下能够使用扩展来实现这一点很方便。
让我们想象一下,我们有一个结构体,可以用一些成员函数来保存3个双打: struct Vector { double x, y, z; // … Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // … }; 这简单一点,但我相信你也同意类似的代码在那里。 这些方法可以让您方便地链接,例如: Vector v = …; v.normalize().negate(); 甚至: […]
第23.3.7节类vector<bool> [vector.bool]第1段规定: template <class Allocator> class vector<bool, Allocator> { public: // types: typedef bool const_reference; … 但是,使用libc ++时,该程序无法编译: #include <vector> #include <type_traits> int main() { static_assert(std::is_same<std::vector<bool>::const_reference, bool>{}, "?"); } 此外,我注意到C ++标准在本规范中始终与C ++ 98保持一致。 而且我还注意到自libc ++第一次引入以来,libc ++始终没有遵循这个规范。 这种不合格的动机是什么?
我无法弄清楚这一点: int main() { int (*) (int *) = 5; return 0; } 上面的任务用g ++ c ++ 11编译。 我知道int (*) (int *)是一个函数的指针,它接受一个(int *)作为参数,并返回一个int,但我不明白你怎么可以将它等于5.起初我以为它是一个不断返回5的函数(从我最近学习的F#中,可能是哈哈),然后我简单地想,函数指针指向内存位置5,但是这不起作用,很明显,也不是hex值。 认为这可能是因为该函数返回一个int,并分配一个int是好的(不知何故),我也试过这个: int * (*) (int *) = my_ptr 其中my_ptr的types为int * ,与第二个函数指针的types相同,如第一种情况下的types为int。 这不会编译。 赋值5或者任何int值,而不是my_ptr ,也不会为这个函数指针编译。 那么这个任务是什么意思? 更新1 我们已经确认这是一个错误,如最佳答案所示。 但是,我们仍然不知道实际发生的情况是您分配给函数指针的值是什么,或者赋值时发生了什么。 任何(好)的解释,将非常感激! 请参阅下面的编辑,以更清楚地了解这个问题。 编辑1 我使用的是gcc版本4.8.2(在Ubuntu 4.8.2中) 编辑2 其实,把它等同于我的编译器。 即使将它等同于一个std :: stringvariables,或者返回一个double的函数名也是可行的。 编辑2.1 有趣的是,把它作为函数指针指向任何返回不是指针的数据types的函数,都会让它编译,比如 std::string (*) […]