C# - 'Double'是一个模棱两可的参考

时间:2012-11-28 18:01:21

标签: c# case-sensitive disambiguation

我的代码库中有以下文件:

StandardUnits.Numbers.Double

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StandardUnits.Numbers
{
    public class Double : Number<double>
    {
        public Double(double value) : base(value) { }
        public static implicit operator Double(double value) { return new Double(value); }
        public static implicit operator double(Double value) { return value._value; }
    }
}

StandardUnitsTest.Program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StandardUnits;
using StandardUnits.Numbers;

namespace StandardUnitsTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Equatable<string> str = "Hello! This is my number: ";
            Number<float> n = 4;
            Double o = 5.5;
            Float p = n + o;

            Console.WriteLine(str + p.ToString());
            Console.Read();
        }
    }
}

出于某种原因,使用“Double”会产生以下错误:

Error 1 'Double' is an ambiguous reference between 'double' and 'StandardUnits.Numbers.Double' 16 13

但是没有为“Float”产生这样的错误,它以与“Double”相同的方式产生(但显然是“float”而不是“double”)。为什么编译器能够区分StandardUnits.Numbers.Floatfloat,而不能区分StandardUnits.Numbers.Doubledouble?为什么区分大小写没有阻止这种情况?

如果需要,我也可以为Number和Float提供代码片段。

5 个答案:

答案 0 :(得分:13)

System.Double存在冲突。

没有System.Float(float代表System.Single),因此没有冲突。

答案 1 :(得分:9)

double的CLR类型为System.Double。这是模棱两可的。

float的CLR类型为System.Single。对于您的Float类型,这并不含糊......尽管它确实建议您的类型应该命名为Single,以便与框架保持一致。理想情况下更改名称,以便它们System命名空间中的类型冲突,但是...假设您真的根本不需要这些类型。 (他们增加了什么好处?)

这确实 与C#中的floatdouble别名以及区分大小写有关。这些只是System.SingleSystem.Double的硬连线别名,永远不会有歧义。这是你对Double的使用,这是不明确的。

答案 2 :(得分:2)

System.Double已经存在(它内置于语言中。)我很好奇你为什么要创建自己的版本。

http://msdn.microsoft.com/en-us/library/system.double.aspx

答案 3 :(得分:2)

这是因为System.Double类型(其别名为double)但没有System.Float:它的名称为System.Single - 其别名为float

答案 4 :(得分:1)

Double命名空间中已经有System个类(double是它的别名),所以如果使用Double,编译器不知道哪个一个你的意思。

但是,floatSystem.Single的别名。没有System.Float,因此没有冲突。

请参阅"Built-in Types"