代码之家  ›  专栏  ›  技术社区  ›  joshcomley

NET4是否提供了一种解决这个简单的通用接口问题的方法?

  •  2
  • joshcomley  · 技术社区  · 14 年前

    假设您有这样一个接口:

    public interface IDoSomething<out T>
    {
        T DoSomething(object value);
    }
    

    DoSomething 在不知道 T ,您必须创建:

    public interface IDoSomething
    {
        object DoSomething(object value);
    }
    

    public interface IDoSomething<out T> : IDoSomething
    {
        new T DoSomething(object value);
    }
    

    然后这样做:

    ((IDoSomething)obj).DoSomething();
    

    ''但是''然后你必须实现 方法;一次显式,一次隐式。

    一个部分有效的解决方案是:

    ((IDoSomething<object>)obj).DoSomething();
    

    但这仅在泛型类型是引用类型时有效;值类型如 DateTime int 即使他们也继承了 object

    有没有解决这个难题的方法(不使用抽象类!)?

    3 回复  |  直到 11 年前
        1
  •  4
  •   Aliostad    14 年前

    不支持Well值类型。

    假设我们有:

    Byte[] bb = new Byte[20];
    byte b = 255;
    bb[0] = b; // here value is copied into the array
    b = 128;
    Console.WriteLine(bb[0]); // will print 255
    

    所以改变b并不改变我们已经分配的值,这是意料之中的。 但如果我们这样做呢:

    object[] bb = new Byte[20]; // throws exception
    

        2
  •  3
  •   thecoop    14 年前

    This article 解释了为什么方差对值类型不起作用(向下大约1/4)。基本上, int -&燃气轮机; object string 只需更改指针类型。

        3
  •  0
  •   supercat    11 年前

    System.Object

    需要 IEnumerable<Object> IEnumerable<T> 它返回的是从 Object . 安 IEnumerable<Int32> Int32 (这是从 对象 ),而是返回字节集合,这些字节集合对于不是专门为处理类型的值而生成的任何代码都没有意义 .