Попытка удалить неоднозначный вызов в конструкторе с участием int и long

«Вызов неоднозначен между следующими методами или свойствами: «fInt.fInt(int, bool)» и «fInt.fInt(long, bool)»

Вот мои два конструктора:

public fInt(int i, bool scale = true)
{
    if (scale) value = i * SCALE;
    else value = i;
}

public fInt(long i, bool scale = true)
{
    if (scale)
    {
        if(i > long.MaxValue / SCALE || i < long.MinValue / SCALE) 
            Debug.LogError("fInt Overflow on creation with scaling");

        value = i * SCALE;
    }
    else value = i;
}

Вот как я вызываю его с помощью int, используя неявное преобразование:

fInt i = 8;

Я хотел бы иметь возможность использовать как int, так и long, чтобы избежать дополнительной проверки, если она не нужна. Любые мысли о том, как это исправить? Должен ли я просто сделать это:

fInt i = (int)8;
fInt i2 = (long)9;

Я бы предпочел не иметь лишнего набора текста, если я могу этого избежать. Вот мои неявные преобразования:

//implicit int to fInt
public static implicit operator fInt(int i)
{
    return new fInt(i);
}

//implicit long to fInt
public static implicit operator fInt(long i)
{
    return new fInt(i);
}

person ATD    schedule 19.02.2015    source источник
comment
Вы процитировали ошибку компилятора, но если я не упускаю ее из виду, вы не указали, на какую строку кода ссылается компилятор. Вы можете это сделать?   -  person phoog    schedule 20.02.2015
comment
Вы не опубликовали никакого кода, который, по крайней мере, в VS2013, мог бы вызвать описанную вами ошибку. Пожалуйста, уточните, в чем конкретно заключается ваш вопрос.   -  person Peter Duniho    schedule 20.02.2015
comment
@phoog Ошибка в неявном преобразовании. Строка возвращает новый fInt(i);... это связано именно с вызовом конструктора следующим образом: new fInt(123);. Я использую Mono с Unity3D... возможно, это как-то связано.   -  person ATD    schedule 20.02.2015
comment
@PeterDuniho У меня выдает ошибку в Mono. Я использую его с Unity3D   -  person ATD    schedule 20.02.2015
comment
@GrantWinney Проблема в том, что он не может определить, использовать ли int или long при выполнении чего-то вроде new fInt(123);   -  person ATD    schedule 20.02.2015
comment
Похоже на ошибку в компиляторе Mono. Вы можете застрять, по крайней мере, до тех пор, пока кто-нибудь не успеет исправить ошибку.   -  person Peter Duniho    schedule 20.02.2015
comment
@GrantWinney Похоже, в Visual Studio все работает нормально. 123 следует рассматривать как int, а 123L — как long.   -  person ATD    schedule 20.02.2015
comment
@PeterDuniho Он работает в VS, поэтому я предполагаю, что это какая-то ошибка.   -  person ATD    schedule 20.02.2015


Ответы (1)


Похоже, это ошибка в редакторе Unity3D... поскольку код отлично работает в Visual Studio. Он смешивает подписи только тогда, когда второй параметр является необязательным.

person ATD    schedule 20.02.2015
comment
Необязательный параметр необходим для возникновения ошибки? т.е. нет ошибки двусмысленности, связанной с методами, которые не имеют значения параметра по умолчанию? Возможно, вам стоит попробовать реализовать необязательный параметр по-старому. т.е. объявить больше перегрузок: fInt(int i), fInt(int i, bool scale), fInt(long i), fInt(long i, bool scale). Две перегрузки без параметра bool, конечно, просто вызывают соответствующую перегрузку, передавая значение по умолчанию. - person Peter Duniho; 20.02.2015
comment
Это должно быть скорее проблема компилятора Mono C#, где он не может обрабатывать числа способом компилятора Microsoft C#. Поэтому говорить, что это ошибка редактора Unity, не на 100% правильно. - person Lex Li; 20.02.2015