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

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

ただし、「Double」と同じ方法で作成された「Float」では、このようなエラーは発生しません(ただし、明らかに「double」ではなく「float」を使用します)。コンパイラがとを区別できるのに、とを区別できStandardUnits.Numbers.Floatないのfloatはなぜですか?大文字と小文字の区別がこれを妨げないのはなぜですか?StandardUnits.Numbers.Doubledouble

必要に応じて、NumberとFloatのコードスニペットも提供できます。

4

5 に答える 5

13

System.Doubleとの競合があります。

System.Float(代わりにSystem.Singlefloatで表されます)がないため、競合は発生しません。

于 2012-11-28T18:03:30.540 に答える
9

のCLRタイプはdoubleですSystem.Double。それがあいまいさです。

のCLRタイプはfloatですSystem.Single。これはタイプとあいまいではありません...フレームワークとの一貫性を保つために、代わりにFloatタイプに名前を付ける必要があることを示唆していますが。Single理想的には、名前空間の型と競合しないように名前を変更します...これらの型が本当に必要であると仮定します。(彼らはどのようなメリットを追加していますか?)System

これは、実際には、C#のおよびエイリアスや大文字と小文字の区別とは何の関係もありません。これらは、およびそれぞれのハードワイヤードエイリアスであり、あいまいになることはありません。あいまいなのはあなたの使用です。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

名前空間にはすでにDoubleクラスがあり(そのエイリアスです)、を使用すると、コンパイラはどちらを意味するのかわかりません。SystemdoubleDouble

ただし、floatはのエイリアスですSystem.Single。がないSystem.Floatので、競合はありません。

「組み込み型」を参照してください。

于 2012-11-28T18:04:15.630 に答える