.net 无法解释的错误:记录成员必须是可读的示例属性或类型为“T[]”的字段才能匹配位置参数

093gszye  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(166)

我尝试将几个Dto数组 Package 在一个 Package 器中,如下所示:

  1. public sealed record SomeWrapper<T>(T[]? L1, T[]? L2, T[]? L3)
  2. : SomeWrapper(L1, L2, L3) where T : Dto;
  3. public record SomeWrapper(
  4. Dto[]? L1,
  5. Dto[]? L2,
  6. Dto[]? L3
  7. );

字符串
因为我希望能够初始化一个SomeWrapper的数组,其中T可以是不同的,即:

  1. List<SomeWrapper> someWrappers = new List<SomeWrapper>()
  2. someWrappers.Add(new SomeWrapper<SomeDto>());
  3. someWrappers.Add(new SomeWrapper<SomeOtherDto>());
  4. return someWrappers;


但是,我得到以下错误:Record member 'L1' must be a readable instance property or field of type 'T[]' to match positional parameter 'L1'
我相信这段代码应该可以工作,所以我不确定这里出了什么问题。这是Dto的样子:

  1. public interface Dto<T> : Dto where T : Entity.Entity;
  2. public interface Dto
  3. {
  4. string Id { get; init; }
  5. };


Entity目前只是一个空接口。
我无法解释这个错误,也不知道如何问这个问题(接受建议)

bvk5enib

bvk5enib1#

让我简化你的问题,当你有:

  1. public record SomeWrapper(Dto[]? L1);

字符串
编译器会自动为相同的名称生成一个公共属性:

  1. public record SomeWrapper
  2. {
  3. public Dto[]? L1 { get; init; }
  4. // ...other members
  5. }


现在,在派生记录中,你声明了一个同名的属性:

  1. public sealed record SomeWrapper<T>(T[]? L1) : SomeWrapper(L1) where T : class, Dto


编译器将假定L1是基类定义的属性。然而,由于您声明了不同的类型,它不再起作用。此错误消息有点误导,因为它建议您修改基类的L1属性的类型。
无论如何,你需要解决这个冲突,我想你不想遇到意外的错误。你需要手动声明一个新的属性:

  1. public sealed record SomeWrapper<T>(T[]? L1) : SomeWrapper(L1) where T : class, Dto
  2. {
  3. public new T[]? L1 => (T[]?)base.L1;
  4. }

展开查看全部

相关问题