Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call a constructor with an ambiguous generic parameter?

Tags:

c#

generics

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)?

like image 887
Bip901 Avatar asked Aug 11 '21 17:08

Bip901


2 Answers

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
like image 198
NineBerry Avatar answered Oct 26 '22 23:10

NineBerry


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.)

like image 21
Jon Skeet Avatar answered Oct 26 '22 23:10

Jon Skeet