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 уже существует (он встроен в язык.) Мне интересно, почему вы создаете свою собственную версию.
Там уже есть Double
класс в System
пространство имен (double
это псевдоним), так что если вы используете Double
, компилятор не знает, какой вы имели в виду.
Тем не мение, float
это псевдоним для System.Single
, Здесь нет System.Float
так что конфликта нет.
Смотрите "Встроенные типы".