Параметр типа отливки - PullRequest
0 голосов
/ 30 июня 2011

Название может быть немного расплывчатым, но я хочу достичь этого, но затем без использования дополнительной лямбды в методе создания:

public class Wrapper
{
    public static Wrapper Create<T>(Func<T, bool> someFunc) where T : Stream
    {
        return new Wrapper(a => someFunc(a as T)); // Works, but lambda
        return new Wrapper((Func<Stream, bool>)(object)someFunc); // Runtime error
        return new Wrapper((Func<Stream, bool>)someFunc); // Compile error
    }

    Func<Stream, bool> _someFunc;
    private Wrapper(Func<Stream, bool> someFunc)
    {
        _someFunc = someFunc;
    }
}

Возможно ли это сделать, если да, то как?

РЕДАКТИРОВАТЬ: класс потока только в качестве примера.

В моем коде я не буду использовать потоковый класс, а также почему тип-параметр, потому что он возвращается из универсального метода, который является методом расширения.

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

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Нет способа делать то, что ты хочешь без лямбды.Func<Stream, bool> должен принимать любой тип Stream в качестве параметра, поэтому метод, который принимает T (это особый тип Stream), не совместим с сигнатурой Func<Stream, bool>

В любом случае, в опубликованном вами коде универсальный параметр совершенно бесполезен;просто удалите его и сделайте метод не универсальным.

1 голос
/ 30 июня 2011

Это не может быть приведено (даже с поддержкой контравариантности), потому что это не безопасное приведение.

Если у меня есть функция, которая работает с FileStream, попробуйте передать ее в Wrapper, япередал его как функцию, которая утверждает, что может действовать на любой поток.Если я затем вызову эту функцию из Wrapper, например, с помощью MemoryStream, то привязка делегата завершится неудачно.Func<Stream, bool> на самом деле вовсе не Func<Stream, bool>.


, если вы хотите сделать Wrapper универсальным (Wrapper<T>), вы можете рассмотреть возможность предоставления не универсального интерфейса IWrapper, реализованногоуниверсальный.Таким образом, вы можете создать коллекцию IWrapper экземпляров и предоставить функциональность, которая действительна для любого Wrapper<T>, при этом сохраняя безопасность типов внутри каждого экземпляра.

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