2013-09-27 4 views
0

Я пытаюсь преобразовать в float анонимный объект класса с плавающим неявным конвертером. Я не уверен, правильно ли объясню. Вот пример:Неявное преобразование типа анонимного объекта

У меня есть следующий класс:

public class MyFloat 
{   
    public float Value { get; set; } 

    public MyFloat(float val) 
    { 
     Value = val; 
    } 

    public static implicit operator MyFloat(float v) 
    { 
     return new MyFloat(v); 
    } 

    public static implicit operator float(MyFloat d) 
    { 
     return d.Value; 
    } 

Тогда, если я стараюсь:

object f1 = new MyFloat(5.0f); 
float f2 = f1; // Unhandled Exception: System.InvalidCastException: Specified cast is not valid. 
float f3 = (MyFloat)f1; 

я InvalidCastException. Я предполагаю, что f1 рассматривается как объект, и он не проверен, если он является реальным типом (MyFloat), неявным для конвертера float. Есть ли способ обхода этой проблемы?

Заранее спасибо

+2

Выполняет ли эта вторая строка? Не похоже, что это должно ... –

+0

Также обратите внимание, что «анонимный объект» не является значимым термином. Я не знаю, что вы подразумеваете под этим вообще ... –

+0

@MrFox Но тогда определение оператора float бессмысленно. –

ответ

0

Проблема здесь, как вы говорите, f1 трактуется как object, не MyFloat - вам нужно брось от object обратно MyFloat и тогда неявный бросок будет работать (как ваш второй пример).

В качестве альтернативы, не объявляйте его object для начала и использования его настоящего типа - MyFloat.

+0

Будет ли 'var f1' делать трюк? –

+0

@jyparask Да, это было бы. var указывает тип переменной. –

+0

@jyparask yep, однако, 'var' - это всего лишь более короткий способ сказать« использовать настоящий тип здесь * ». – James

1

Не используйте object но MyFloat, в противном случае компилятор не знает, во время компиляции, что ваш object имеет тип MyFloat:

Вместо:

object f1 = new MyFloat(5.0f); 
float f2 = f1; // Unhandled Exception: System.InvalidCastException: Specified cast is not 

это:

MyFloat f1 = new MyFloat(5.0f); 
float f2 = f1; 

или бросить его соответствующим образом (хотя это кажется излишним):

float f2 = (MyFloat)f1 
Смежные вопросы