Tag: 语言规范

如何有效地确保十进制值至少有N个小数位

我想在进行算术运算之前有效地确保十进制值至少具有N(在下面的示例中为3)位置。 显然,我可以用”0.000######….#”进行格式化然后解析,但效率相对较低,而且我正在寻找避免转换为字符串/从字符串转换的解决方案。 我尝试过以下解决方案: decimal d = 1.23M; d = d + 1.000M – 1; Console.WriteLine(“Result = ” + d.ToString()); // 1.230 在Debug和Release版本中使用Visual Studio 2015编译时,它似乎适用于所有值<= Decimal.MaxValue – 1 。 但我怀疑编译器是否可以优化(1.000 – 1)。 C#规范中有什么保证它始终有效吗? 或者是否有更好的解决方案,例如使用Decimal.GetBits ? UPDATE 继Jon Skeet的回答后,我之前尝试过添加0.000M ,但这对dotnetfiddle无效。 所以我很惊讶地看到Decimal.Add(d, 0.000M)确实有效。 这是一个dotnetfiddle比较d + 000M decimal.Add(d,0.000M)和decimal.Add(d,0.000M) :结果与dotnetfiddle不同,但在使用Visual Studio 2015编译相同代码时相同: decimal d = 1.23M; decimal r1 = decimal.Add(d, […]

C#规范(团队?委员会?)是否曾考虑过这种对象创建语法?

我之前从未发过这种性质的问题,所以如果它不适合SO,那就不要伤害我的感情太糟糕了,我会删除它。 为了尽可能保持我所关心的一切尽可能接近左边距,我一直希望能写下这样的东西: DataService1.DataEntities dataEntities = new(constructorArg1, …) 我认为另一个原因是我喜欢通过使用var得到的额外屏幕空间,当类型已经出现在作业的右侧时,但我的大脑有太多年来在左侧寻找类型。 再说一次,被困在我的方式并不是一个很好的理由,希望有一个规范……

运行时类型与编译时类型方法调用

C#4.0规范如下: 调用虚方法时,进行该调用的实例的运行时类型决定了要调用的实际方法实现。 在非虚方法调用中,实例的编译时类型是决定因素。 起初,我认为这与初始化有关。 例如,给定两个初始化: BaseClass bcDerived = new Derived(); vs BaseClass bcBase = new BaseClass(); 和辅助类中的重载: public virtual void Method(Derived d) { Console.WriteLine(“Result = derived called”); } public virtual void Method(BaseClass d) { Console.WriteLine(“Result = base called”); } 在这种情况下, Method调用不受virtual关键字的影响。 无论标记为virtual ,都会调用派生最少的重载。 仅在Derived类中的override期间,方法调用才会更改。 那么,“运行时类型”和“编译时类型”是什么意思呢? 它们如何影响方法调用?

有关C#语言规范中隐式转换的问题

6.1节隐式 转换因此定义了身份转换 : 身份转换从任何类型转换为相同类型。 存在这种转换,使得已经具有所需类型的实体可以被称为可转换为该类型。 现在,这些句子的目的是什么? (在§6.1.6隐式参考转换中) 隐式引用转换是: […] 从任何引用类型到引用类型 T如果它具有隐式标识或引用转换为引用类型 T 0并且T 0具有到T的标识转换。 和: (在§6.1.7拳击转换中) 如果值类型具有到接口类型I 0的装箱转换并且I 0具有到I的标识转换,则值类型具有到接口类型I的装箱转换。 最初它们似乎是多余的(同义词)。 但他们必须在某个目的,所以为什么他们在那里? 你能给出一个T 1 , T 2这两种类型的例子,如果不是上面引用的段落, T 1就不能隐式转换为T 2吗?

如何在C#中实现foreach?

在C#中如何实现foreach ? 我想它的一部分看起来像: var enumerator = TInput.GetEnumerator(); while(enumerator.MoveNext()) { // do some stuff here } 但是我不确定究竟发生了什么。 返回enumerator.Current器使用什么方法。每个循环的当前流程? 它是为[每个周期]返回还是采用匿名函数或其他东西来执行foreach的主体?

为什么C#不允许通用属性?

我想知道为什么我不能像通用方法那样在非generics类中拥有generics属性。 即: public interface TestClass { IEnumerable GetAllBy(); //this works IEnumerable All { get; } //this does not work } 我读了@Jon Skeet的答案 ,但这只是一个声明,很可能是规范中的某个地方。 我的问题是为什么它实际上是这样的? 这种限制是否避免了一些问题?