C # Общий Тип Параметр Совместное использование между классами - PullRequest
2 голосов
/ 02 января 2012

Предположим, у вас есть следующая общая иерархия классов:

public abstract class GenericBase<T>
{
    T SomeProperty{ get; set; }
}

public class Foo<T>
{
    T SomeProperty{ get; set; }
}

public abstract class GenericChild<T> : GenericBase<T>
{
    // ...

    public bool DoSomething(Foo<T> foo)
    {
        // This is invalid:
        return SomeProperty == foo.SomeProperty;
    }
}

Проверка на равенство в методе DoSomething не будет компилироваться. Выдает следующую ошибку:

Operator '==' cannot be applied to operands of type 'T' and 'T'

Если это полезно, эти классы находятся в отдельных файлах. Как лучше всего разрешить такое сравнение на равенство? Есть ли какой-то шаблон или что-то такое, что позволяет это в C #?

Обновление:

В нескольких ответах предлагается использовать:

where T : SomeClass

К сожалению, очень часто T будет примитивным типом.

Ответы [ 4 ]

8 голосов
/ 02 января 2012

== не применимо для всех типов.Он может использоваться только , если T ограничен типом, который его поддерживает, например where T : class.Тем не менее, вам, вероятно, будет лучше обслуживаться с использованием метода Equals.

return SomeProperty.Equals(foo.SomeProperty);

с соответствующей проверкой нуля.

2 голосов
/ 02 января 2012

Попробуйте:

public abstract class GenericBase<T>
    where T : IEquatable<T>
{
    public T SomeProperty { get; set; }
}

public class Foo<T>
{
    public T SomeProperty { get; set; }
}

public abstract class GenericChild<T> : GenericBase<T>
    where T : IEquatable<T>
{
    // ... 

    public bool DoSomething(Foo<T> foo)
    {
        // This is valid: 
        return SomeProperty.Equals(foo.SomeProperty);
    }
}

C # не знает, можно ли применить == к T.

1 голос
/ 02 января 2012

Если вы хотите сделать это, вы должны указать, какой тип T.

Например:

public abstract class GenericBase<T> where T : MyClass
{
    T SomeProperty{ get; set; }
}

public class Foo<T> where T : MyClass
{
    T SomeProperty{ get; set; }
}

public abstract class GenericChild<T> : GenericBase<T> where T : MyClass
{
}

В вашем классе MyClass вы можете реализовать интерфейс IEquatable, так чтовы можете сделать SomeProperty.Equals(foo.SomeProperty)

Если вы не добавите ограничение where, вы все равно можете использовать объект.Equals

0 голосов
/ 02 января 2012

Если вы хотите сравнить объекты типа T, вы можете использовать интерфейс IEqualityComparer (сравнивает с заданными объектами данного типа) или заставить T реализовать IEquatable (позволяет сравнивать объект с объектом типа T)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...