我有以下抽象Func。
public abstract Func<IEnumerable<TInput>, int, TIndexed> IndexedObjectConstructor { get; }
我的问题与实施方法有关。 第一:我创建一个具有相同签名的方法
public IIndexedOhlcv Test(IEnumerable<IOhlcv> l, int i)
{
return new IndexedCandle(l, i);
}
The,将其分配给Func。
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor = Test;
但是,这显示了错误
错误CS0106修饰符“覆盖”对此项目无效
我知道可以使用Lambda如下解决此问题:
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor => Test;
或
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
=> (l, i) => new IndexedCandle(l, i);
我的问题是我的“ IndexedObjectConstructor = Test”;不起作用?
答案 0 :(得分:2)
IndexedObjectConstructor
是一个仅获取属性,它返回一个Func<IEnumerable<TInput>, int, TIndexed>
。在尝试覆盖的过程中,您正在定义要使用IndexedObjectConstructor
初始化的字段Test
。
字段不能被覆盖(即使可能,它也是基类中的属性,而不是字段),并且Test
本身也不是属性获取器。
“使用lambda”实现它时,您使用的是相对较新的inline property declaration语法。
答案 1 :(得分:1)
这是因为被覆盖的东西是一个属性,这意味着您必须在覆盖时声明一个get
访问器,而这样做并不会完成
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor = Test;
它还解释了以下原因的原因
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor => Test;
答案 2 :(得分:0)
您不能只是将方法分配给属性。您需要完全实现get
。
您的代码应如下所示:
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
{
get
{
return (xs, i) => Test(xs, i);
}
}
但是,使用这样的更新语法就足够了:
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
{
get => Test;
}
...或者这个:
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
=> Test;
答案 3 :(得分:0)
这是完整的工作示例。
public abstract class Test<TInput, TIndexed>
{
public abstract Func<IEnumerable<TInput>, int, TIndexed> IndexedObjectConstructor { get; }
}
public class Test1 : Test<IOhlcv, IIndexedOhlcv>
{
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
{
get
{
return TestMethod;
}
}
public IIndexedOhlcv TestMethod(IEnumerable<IOhlcv> l, int i)
{
return null;
}
}
public interface IOhlcv
{
}
public interface IIndexedOhlcv
{
}
现在,如果您要问为什么我们必须使用getter实现属性。您可以使用其他语法。您可以按照以下方式进行操作。
public class Test1 : Test<IOhlcv, IIndexedOhlcv>
{
public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor => TestMethod;
public IIndexedOhlcv TestMethod(IEnumerable<IOhlcv> l, int i)
{
return null;
}
}