C# 泛型转换问题

本文关键字:问题 转换 泛型 | 更新日期: 2023-09-27 18:32:50

我有一个通用的过滤器类,我想制作这个类的条件版本:

public abstract class Filter<T, R> 
{
    protected abstract R GetResult(T input);
    private class JoinedFilterIf<S> : Filter<T, S>
    {
        private readonly Filter<T, R> _left;
        private readonly Filter<R, S> _right;
        private readonly Func<R, bool> _condition;
        public JoinedFilterIf(Filter<T, R> left, Filter<R, S> right, Func<R, bool> condition)
        {
            _left = left;
            _right = right;
            _condition = condition;
        }
        protected override S GetResult(T input)
        {
            var result = _left.GetResult(input);
            return _condition(result) ? _right.GetResult(result) : (S)((object)result);
        }
    }
}

有什么方法可以避免在 GetResult 返回表达式中使用装箱?

C# 泛型转换问题

这似乎是编译的。

我添加的是一个where S: R如果这就是你要找的

 public abstract class Filter<T, R>
    {
        protected abstract R GetResult(T input);
        private class JoinedFilterIf<S> : Filter<T, S> where S : R
        {
            private readonly Filter<T, R> _left;
            private readonly Filter<R, S> _right;
            private readonly Func<R, bool> _condition;
            public JoinedFilterIf(Filter<T, R> left, Filter<R, S> right, Func<R, bool> condition)
            {
                _left = left;
                _right = right;
                _condition = condition;
            }
            protected override S GetResult(T input)
            {
                var result = _left.GetResult(input);
                return _condition(result) ? _right.GetResult(result) : (S)(result);
            }
        }
    }

基本上这意味着什么 - 需要从"R"继承"S"

对我来说的问题是 - 你为什么要引入额外的 S 类型?我相信在这两种情况下,只定义"T"和"R"就足够了。它看起来像这样

public abstract class Filter<T, R> where R : T
{
    protected abstract R GetResult(T input);
    private class JoinedFilterIf<S> : Filter<T, R> 
    {
        private readonly Filter<T, R> _left;
        private readonly Filter<T, R> _right;
        private readonly Func<R, bool> _condition;
        public JoinedFilterIf(Filter<T, R> left, Filter<T, R> right, Func<R, bool> condition)
        {
            _left = left;
            _right = right;
            _condition = condition;
        }
        protected override R GetResult(T input)
        {
            var result = _left.GetResult(input);
            return _condition(result) ? _right.GetResult(result) : (result);
        }
    }
}

这说明的是,结果 R 将是 T 的派生类型,因此它可以传递回"GetResult"函数,就好像它是 T 类型一样