Как я могу неявно преобразовать другую структуру в мой тип? - PullRequest
3 голосов
/ 10 июня 2010

Как это MyClass x = 120;, возможно ли создать такой пользовательский класс? Если так, как я могу это сделать?

Ответы [ 4 ]

4 голосов
/ 10 июня 2010

Обычно считается плохой идеей использовать неявные операторы, так как они, в конце концов, неявные и работают за вашей спиной. Отладка кода, заваленного перегрузками операторов, - это кошмар. Тем не менее, что-то вроде этого:

public class Complex
{
    public int Real { get; set; }
    public int Imaginary { get; set; }

    public static implicit operator Complex(int value)
    {
        Complex x = new Complex();
        x.Real = value;
        return x;
    }
}

вы можете использовать:

Complex complex = 10;

или вы можете перегрузить оператор +

public static Complex operator +(Complex cmp, int value)
{
  Complex x = new Complex();
  x.Real = cmp.Real + value;
  x.Imaginary = cmp.Imaginary;
  return x;
 }

и используйте код как

complex +=5;
4 голосов
/ 10 июня 2010

Не уверен, что это то, что вы хотите, но вы можете получить это, реализовав неявный оператор: http://msdn.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx

3 голосов
/ 10 июня 2010

Создайте неявный оператор:

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

Например:

public struct MyStruct // I assume this is what you meant, since you mention struct in your title, but use MyClass in your example. 
{
    public MyClass(int i) { val = i; }
    public int val;
    // ...other members

    // User-defined conversion from MyStruct to double
    public static implicit operator int(MyStruct i)
    {
        return i.val;
    }
    //  User-defined conversion from double to Digit
    public static implicit operator MyStruct(int i)
    {
        return new MyStruct(i);
    }
}

"Это хорошая идея?"спорно.Неявные преобразования имеют тенденцию нарушать общепринятые стандарты для программистов;вообще не очень хорошая идея.Но если вы делаете какую-то большую библиотеку, например, это может быть хорошей идеей.

1 голос
/ 10 июня 2010

да, вот короткий пример ...

  public struct MyCustomInteger
  {
     private int val;
     private bool isDef;
     public bool HasValue { get { return isDef; } } 
     public int Value { return val; } } 
     private MyCustomInteger() { }
     private MyCustomInteger(int intVal)
     { val = intVal; isDef = true; }
     public static MyCustomInteger Make(int intVal)
     { return new MyCustomInteger(intVal); }
     public static NullInt = new MyCustomInteger();

     public static explicit operator int (MyCustomInteger val)
     { 
         if (!HasValue) throw new ArgumentNullEception();
         return Value;
     }
     public static implicit operator MyCustomInteger (int val)
     {  return new MyCustomInteger(val); }
  }
...