2

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

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; }
    }
}

标准单元测试程序

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.Floatand float,但不能区分StandardUnits.Numbers.Doubleand double?为什么区分大小写不能阻止这种情况?

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

4

5 回答 5

13

与System.Double存在冲突。

没有 System.Float (floatSystem.Single代替),因此没有冲突。

于 2012-11-28T18:03:30.540 回答
9

的 CLR 类型doubleSystem.Double. 这就是歧义。

的 CLR 类型floatSystem.Single. 这与您的类型没有歧义Float......尽管它确实建议您的类型应该Single改为命名,以与框架保持一致。理想情况下,更改名称以便它们不会与命​​名空间中的类型冲突System……假设您确实需要这些类型。(他们增加了什么好处?)

这实际上与 C#中的and别名和区分大小写无关。这些只是 和 的硬连线别名,永远不会模棱两可。这是你的使用是模棱两可的。floatdoubleSystem.SingleSystem.DoubleDouble

于 2012-11-28T18:03:50.900 回答
2

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

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

于 2012-11-28T18:03:34.220 回答
2

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

于 2012-11-28T18:04:14.910 回答
1

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

但是,float是 的别名System.Single。没有System.Float,所以没有冲突。

请参阅“内置类型”

于 2012-11-28T18:04:15.630 回答