Tag: language specifications

什么时候generics参数永远不会为空

在通用的GetHashCode(T foo)方法中,我检查foo是否为null 。 然而,我偶然发现了一个奇怪的Resharper警告。 在下面的代码中, foo永远不会为null吗? private class FooComparer : IEqualityComparer where T: Foo { public int GetHashCode(T foo) { // resharper warning: “Expression is always false” if (Object.ReferenceEquals(null,foo)) return 0; // … calculate hash } } 但据我所知,以下是完全合法的: Foo foo = null; var fooComparer = new FooComparer(); int hash = fooComparer.GetHashCode(foo);

++ i C#和C ++中的运算符差异

我有以下用C ++和C#编写的代码 int i=0; ++i = 11; 在此C#编译器带来错误之后 The left-hand side of an assignment must be a variable, property or indexer 但C ++编译器生成此代码时没有错误,我得到了一个值为i的结果11 。 这种差异的原因是什么?

运算符’==’无法应用于类型T?

我认为这种方法有效,但我错了: static void Equals(T x, T y) { return x == y; //operator == can’t be applied to type T } 在阅读了规范(v3.0中的第7.2.4节和v4.0中的第7.3.4节)之后: 7.2.4二元运算符重载决策 forms为x op y的操作,其中op是可重载的二元运算符,x是类型X的表达式,y是类型Y的表达式,按如下方式处理: 由X和Y为操作运算符op(x,y)提供的候选用户定义运算符集合被确定。 该集合由X提供的候选运算符和Y提供的候选运算符组合而成,每个运算符使用§7.2.5的规则确定。 如果X和Y是相同的类型,或者如果X和Y是从公共基类型派生的,则共享候选运算符仅出现在组合集中一次。 如果候选用户定义的运算符集不为空,则这将成为该操作的候选运算符集。 否则,预定义的二元运算符op实现(包括它们的提升forms)成为该操作的候选运算符集。 给定运算符的预定义实现在运算符的描述中指定(第7.7节到第7.11节)。 §7.4.3的重载决策规则应用于候选运算符集合,以根据参数列表(x,y)选择最佳运算符,并且此运算符成为重载解析过程的结果。 如果重载决策无法选择单个最佳运算符,则会发生编译时错误。 在第2步中,我认为应该应用此预定义实现: bool operator ==(object x, object y); bool operator !=(object x, object y); 因为C#中的所有内容都来自Object。 如何在步骤3中发生编译时错误? 在这种情况下,我认为“重载决议无法选择”是可能的。 编辑当我实现这样的事情时,我想到了这个问题: class EnumComparer : IEqualityComparer […]

关于结构的问题

MSDN说,一个16字节或更少的类将更好地作为结构[引证]处理 。 这是为什么? 这是否意味着如果一个结构超过16个字节,它的效率低于一个类或它是否相同? 你如何确定你的class级是否在16字节以下? 是什么限制了结构体像一个类一样? (除了禁止无参数构造函数)