使用具有不一致可访问性的结构
本文关键字:访问 结构 不一致 | 更新日期: 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> { ... }