Make class return a field

Viewed 559

Is there a way to make a class return one of its fields by default like that:

public class TestClass
{
    public string something;
}

TestClass test = new TestClass();
test = "alpha"; // "alpha" string is assigned to "something"
Console.Write(test); // test returns "alpha" string from "something"

How to make this work?

4 Answers

For all those saying that's impossible,)

public class TestClass
{
    public string something;

    public static implicit operator TestClass(string s) => new TestClass { something = s};

    public static implicit operator string(TestClass testClass) => testClass.something;
}

Usage:

TestClass test = new TestClass();
test = "alpha";
Console.WriteLine(test);

Gives:

alpha

Note: Console.WriteLine takes test as string and calls Console.WriteLine(string value) overload thanks to implicit conversion.

You can't make "a class return a field", but you can override its ToString method, so when it's printed with something like Console.Write you'll get the output you want:

public class TestClass
{
    public string Something {get; set;}

    public override string ToString()
    {
        return Somethig;
    }
}

Is there a way to make a class return one of its fields by default?

No. Classes are not designed to return any value.

An alternative way to achieve what you mentioned in your question is defining property with get; set;, something like:

public class TestClass
{
    public string Something  { get; set; }
}

which you can use like:

TestClass test = new TestClass();
test.Something = "alpha"; // "alpha" string is assigned to "something"
Console.Write(test.Something); // test returns "alpha" string from "something"

I would prefer to use the constructor and overload method ToString(), so you get an immutable object.

public class TestClass
{
    private readonly string something;

    public TestClass(string something)
    {
        this.something = something;
    }

    public override string ToString()
    {
        return something;
    }
}

TestClass test = new TestClass("alpha");
Console.Write(test);
Related