Bip901
Bip901

Reputation: 808

How to call a constructor with an ambiguous generic parameter?

I have the following generic class:

class Foo<T>
{
    //Constructor A
    public Foo(string str)
    {
        Console.Write("A");
    }

    //Constructor B
    public Foo(T obj)
    {
        Console.Write("B");
    }
}

I want to create an instance of this class with T being a string, using constructor B.

Calling new Foo<string>("Hello") uses constructor A. How can I call constructor B (without using reflection)?

Upvotes: 7

Views: 361

Answers (2)

NineBerry
NineBerry

Reputation: 28499

Since the two constructors use different names for the arguments, you can specify the name of the argument to choose the constructor to use:

new Foo<string>(str: "Test"); // Uses constructor A

new Foo<string>(obj: "Test"); // Uses constructor B

Upvotes: 13

Jon Skeet
Jon Skeet

Reputation: 1500535

It's horrible, but you could use a local generic method:

public void RealMethod()
{
    // This is where I want to be able to call new Foo<string>("Hello")

    Foo<string> foo = CreateFoo<string>("Hello");

    CreateFoo<T>(T value) => new Foo(value);
}

You could add that as a utility method anywhere, mind you:

public static class FooHelpers
{
    public static Foo<T> CreateFoo<T>(T value) => new Foo(value);
}

(I'd prefer the local method because this feels like it's rarely an issue.)

Upvotes: 8

Related Questions