使用带有泛型的结构 - 不一致的可访问性

时间:2012-04-19 12:53:05

标签: c# generics struct

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

  public class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
    {

        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}

 public abstract class ObjectBase<T> 
{
}

它不会让我为我的struct使用private,因为它会抛出错误: 可访问性不一致:基类'ObjectBaseAuditLogEntry.AuditLogEntryStruct&gt;'比“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的过程中实现这一目标? 谢谢, 亚历

2 个答案:

答案 0 :(得分:2)

当一个或多个类型参数不公开时,您无法从泛型类派生公共类

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

如果你有

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> 
{
}

答案 1 :(得分:0)

考虑这个例子:

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 { ...  }

让你的struct实现它并将它用作你的类型参数

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