Как Вы обеспечиваете тип по умолчанию для дженериков?

Безусловно лучший инструмент, который я использовал для инженерного анализа и круглого легкого Java-> UML, Borland Вместе . Это основано на Eclipse (не только единственный плагин) и действительно работает хорошо.

28
задан Max Schmeling 8 July 2009 в 17:24
поделиться

4 ответа

Вы не можете сделать это в определении класса:

var foo = new MyGenericClass(); // defaults to integer... this doesn't work
var bar = new MyGenericClass<MyEnum>(); // T is a MyEnum

Если действительно цените неявность типа по умолчанию, являющегося int, вам придется сделать это с помощью статического фабричного метода , хотя я не вижу в этом ценности.

public class MyGenericClass<T>
{
    public static MyGenericClass<T> Create()
    {
        return new MyGenericClass<T>();
    }
    public static MyGenericClass<int> CreateDefault()
    {
        return new MyGenericClass<int>();
    }
}

См. ниже, как вы действительно не получаете выгоды от вышеизложенного.

var foo = MyGenericClass<MyEnum>.Create();
var bar1 = MyGenericClass.CreateDefault(); // doesn't work
var bar2 = MyGenericClass<int>.CreateDefault(); // works, but what's the point

Если вы хотите пойти еще дальше, вы можете создать статический фабричный класс, который будет решить эту проблему, но это еще более нелепое решение, если вы делаете это только для того, чтобы указать тип по умолчанию:

public static class MyGenericClassFactory
{
    public static MyGenericClass<T> Create<T>()
    {
        return new MyGenericClass<T>();
    }
    public static MyGenericClass<int> Create()
    {
        return new MyGenericClass<int>();
    }
}

var foo = MyGenericClassFactory.Create(); // now we have an int definition
var bar = MyGenericClassFactory.Create<MyEnum>();
3
ответ дан 28 November 2019 в 02:30
поделиться

Итак ... почему бы не использовать простое наследование? Например:

class MyGenericClass<T>
{
}

class MyGenericClass : MyGenericClass<int>
{
}

Таким образом, вы можете писать обоими способами:

var X = new MyGenericClass<string>();
var Y = new MyGenericClass(); // Is now MyGenericClass<int>
78
ответ дан 28 November 2019 в 02:30
поделиться

Компилятор может вывести аргументы типа в методах большую часть времени на основе типа переданных аргументов:

public void DoSomething<T>(T test) {
}

можно вызвать с помощью

DoSomething(4);                   // = DoSomething<int>(4);
DoSomething(MyEnum.SomeValue);    // = DoSomething<MyEnum>(MyEnum.SomeValue);

Кстати, у вас также могут быть неуниверсальные перегрузки универсального метода.

1
ответ дан 28 November 2019 в 02:30
поделиться

Сохраните исходную версию (неуниверсальную версию) и создайте ее универсальную версию.

Затем вызовите общую версию из своей неуниверсальной версии.

void Main()
{
DoSomething(2);
DoSomething(EnumValue);

}

public void DoSomething(int test) {
DoSomething<int>(test);
}

// Define other methods and classes here
public void DoSomething<T>(T test) {
Console.WriteLine(test);
}
3
ответ дан 28 November 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: