views:

304

answers:

5

I have been given a sample statement:

MyClass myclass = 3;

How is it possible to make this a valid statement? What code do I need to include in MyClass to support the implicit conversion from an int?

+14  A: 

You need an implicit conversion operator:

public class MyClass
{
    private readonly int value;
    public MyClass(int value)
    {
        this.value = value;
    }

    public static implicit operator MyClass(int value)
    {
        return new MyClass(value);
    }
}

Personally I'm not a huge fan of implicit conversions most of the time. Occasionally they're useful, but think carefully before putting them in your code. They can be pretty confusing when you're reading code.

On the other hand, when used thoughtfully, they can be amazingly handy - I'm thinking particularly of the conversions from string to XName and XNamespace in LINQ to XML.

Jon Skeet
that's actually pretty slick.
0A0D
They're confusing for classes for suresies. When used consistently with immutable structs, though, it is in fact not confusing, but very powerful. `FeetAndInches length = "10\'-3/16\""` is pretty obvious and leaves no room for question as to how it functions.
Michael Meadows
@Michael: Actually it does. What does it do if the input string is null? Or empty? Or contains garbage? In each case, does it throw or does it return a nonsensical value? These answers are non-obvious to anyone reading the code, so you probably should not use an implicit operator there. (Of course, an implicit operator going the opposite way would be different, but then there’s already `ToString()` for that.)
Timwi
@Timwi I think there's room for consistency by convention. I like to make sure that all of my structs have an uninitialized state `var feetAndInches = FeetAndInches.Empty`. This is also the default value. You can't assign null to a struct, so that's not an issue. If you assign a null string variable or otherwise unparseable string, then throw a parse exception. If you do this consistently, there shouldn't be confusion, and your code becomes much more readable.
Michael Meadows
A: 

It's possible if MyClass has an implicit conversion from int.

Using Conversion Operators

bruno conde
You mean "an implicit conversion *from* `int`", right?
sepp2k
@sepp2k, right.
bruno conde
A: 

You need to overload the implicit constructor operator:

public static implicit operator MyClass (int rhs)
{ 
    MyClass c = new MyClass (rhs);
    return c;
}
Simon P Stevens
+5  A: 

Here's how:

public class MyClass
{
    public static implicit operator MyClass(int i)
    {
        return new MyClass(i);
    }
}

This uses C# feature called implicit conversion operator.

Anton Gogolev
A: 

Just implement an implicit conversion operator.

Daniel Brückner