使用具有不一致可访问性的结构

本文关键字:访问 结构 不一致 | 更新日期: 2023-09-27 18:31:33

我正在尝试在结构继承中使用泛型,请参阅。

  public class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
    {
        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}
 public abstract class ObjectBase<T> 
{
}

它不允许我对结构使用 private,因为它会抛出错误:不一致的可访问性:基类"ObjectBaseAuditLogEntry.AuditLogEntryStruct>"比类"AuditLogEntry"更难访问。

但是,我真的不想公开我的结构。有什么想法吗?谢谢亚历克斯

跟进问题:

以下是我们正在努力做的事情:

class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
{
  internal struct AuditLogEntryStruct
        {
            public int AuditID;
}
  public int AuditID
        {
            get
            {
                return udtObject.AuditID;
            }
set{
BeginEdit();
 udtObject.AuditID = value;
        }
}
 class ObjectBase<T>
{
  protected T udtObject;
        protected T udtPreEditObject;
  protected  void BeginEdit()
        {
            if (!IsDirty)
            {
                IsDirty = true;
                udtPreEditObject = udtObject;
            }
        }
}

我不确定如何在公开AuditLogEntryStruct中实现这一点?谢谢亚历克斯

使用具有不一致可访问性的结构

当一个或多个类型参数不是公共的时,不能从泛型类派生公共类

任何类型派生自

的类型都必须像派生类一样可访问,将作为类型参数给出的任何类型参数包含在基类中

如果你有

public class publicClass{}

任何类都可以从 A 派生,但是如果您将其更改为

internal class internalClass{}

只有其他内部类可以从中派生。

如果将任一类型作为类型参数传递,则也是如此。以下前三个有效,第四个无效

public class A : List<publicClass>{}
internal class B : List<internalClass>{}
internal class C : List<publicClass>{}
//not valid because D has wider accessibility than the close generic type List<internalClass>
public class D : List<internalClass>{}

编辑语言团队在某些时候必须做出决定,是将声明为你的类型无效,还是使任何导致非法访问无法访问类型的使用无效。在您的情况下,将有几个方法返回一个类型,除了您的类之外,所有其他方法都无法访问该类型,并且许多方法采用其他类无法提供的类型的参数。因此,唯一实际能够使用类对象的对象是类的对象。你可以用组合而不是继承来解决这个问题。

public class AuditLogEntry
{
        private ObjectBase<AuditLogEntry.AuditLogEntryStruct> _entry;
        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}
public abstract class ObjectBase<T> 
{
}

考虑这个例子:

public class Foo : List<Bar>
{
    private struct Bar { }
}

var myFoo = new Foo();
...
var x = myFoo()[0]; // expression on the right side is of type Bar, yet Bar is inaccessible

更新

您要实现的目标实际上并不需要泛型。您只能访问ObjectBase<T>内部的结构,就好像它们是对象一样。您不妨将它们更改为object并完全删除泛型类型。

如果你有更多的逻辑需要某种功能从AuditLogEntryStruct ObjectBase<T>中访问,你可以提取一个接口:

public interface IStructsWithSomeFunctionality { ...  }

让你的结构实现它并将其用作你的类型参数

public class AuditLogEntry : ObjectBase<IStructsWithSomeFunctionality> { ... }