C# - "Двойной" является неоднозначной ссылкой

У меня есть следующие файлы в моей базе кода:

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.Float а также float, но не между StandardUnits.Numbers.Double а также double? Почему чувствительность к регистру не мешает этому?

При желании я могу предоставить фрагменты кода для Number и Float.

5 ответов

Решение

Существует конфликт с System.Double.

Там нет System.Float (float представлен System.Single вместо), следовательно, нет конфликта.

Тип CLR для double является System.Double, Это двусмысленность.

Тип CLR для float является System.Single, Это не двусмысленно с вашим Float тип... хотя он предполагает, что ваш тип должен быть назван Single вместо этого для согласованности со структурой. В идеале измените имена, чтобы они не конфликтовали с типами в System пространство имен, хотя... при условии, что вам действительно нужны эти типы вообще. (Какие преимущества они добавляют?)

Это не имеет ничего общего с float а также double псевдонимы в C# и чувствительность к регистру, на самом деле. Это просто жесткие псевдонимы для System.Single а также System.Double соответственно и никогда не будет двусмысленным. Это ваше использование Double что неоднозначно.

Это потому что есть System.Double тип (его псевдоним double) но нет System.Float: это называется System.Single - его псевдоним float,

System.Double уже существует (он встроен в язык.) Мне интересно, почему вы создаете свою собственную версию.

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

Там уже есть Double класс в System пространство имен (double это псевдоним), так что если вы используете Double, компилятор не знает, какой вы имели в виду.

Тем не мение, float это псевдоним для System.Single, Здесь нет System.Floatтак что конфликта нет.

Смотрите "Встроенные типы".

Другие вопросы по тегам