2012-11-28 3 views
2

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

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 

Но нет такой ошибки не производится для «Поплавок», который производится идентичным образом, чтобы «Двойной» (но с «поплавком» вместо «двойного», очевидно). Почему компилятор способен различать StandardUnits.Numbers.Float и float, но не между StandardUnits.Numbers.Double и double? Почему чувствительность к регистру не мешает этому?

Я могу предоставить фрагменты кода для номера и поплавка, если это необходимо.

ответ

13

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

Существует нет System.Float (float вместо этого), следовательно, нет конфликта.

2

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

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

+0

Невежество. Сначала я попытался сделать «Float» и понял, что этого не существует, поэтому я сделал свой собственный. Затем попробовал то же самое с «Двойным». ;) – weberc2

+2

Не беспокойтесь. Я однажды сделал свой собственный класс строк. Намного хуже. – nathan

+0

Кроме того, моя собственная оболочка, которая наследуется от общего класса обертки «Numbers». – weberc2

9

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

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

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

+0

Gotcha, спасибо большое. – weberc2

+0

Чтобы решить свой вопрос: во-первых, я не знал, что система предложила эти структуры для начала (или, скорее, что ее примитивы являются псевдонимами для этих структур). Во-вторых, System.Single и System.Double - это структуры; Я собираюсь на занятия. В-третьих, они определяют мой пользовательский класс (Number), поведение которого я бы хотел наследовать. – weberc2

2

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

1

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

Однако float является псевдонимом для System.Single. Нет System.Float, поэтому конфликта нет.

См. "Built-in Types".

Смежные вопросы