Почему OracleParameter реализует ICloneable, но не предоставляет Clone ()? - PullRequest
4 голосов
/ 26 августа 2009

Я использую библиотеку OracleClient версии 1.0.5000.0, и меня смущает класс OracleParameter и его реализация ICloneable.

Это определение класса OracleParameter:

public sealed class OracleParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable {
    public OracleParameter();
    public OracleParameter(string name, object value);
    public OracleParameter(string name, OracleType oracleType);
    public OracleParameter(string name, OracleType oracleType, int size);
    public OracleParameter(string name, OracleType oracleType, int size, string srcColumn);
    public OracleParameter(string name, OracleType oracleType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value);

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [RefreshProperties(RefreshProperties.All)]
    [Browsable(false)]
    public DbType DbType { get; set; }
    [RefreshProperties(RefreshProperties.All)]
    public ParameterDirection Direction { get; set; }
    [Browsable(false)]
    [DesignOnly(true)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    [DefaultValue(false)]
    public bool IsNullable { get; set; }
    [DefaultValue(0)]
    [Browsable(false)]
    public int Offset { get; set; }
    [RefreshProperties(RefreshProperties.All)]
    public OracleType OracleType { get; set; }
    [DefaultValue("")]
    public string ParameterName { get; set; }
    [DefaultValue(0)]
    public byte Precision { get; set; }
    [DefaultValue(0)]
    public byte Scale { get; set; }
    [DefaultValue(0)]
    public int Size { get; set; }
    [DefaultValue("")]
    public string SourceColumn { get; set; }
    public DataRowVersion SourceVersion { get; set; }
    [DefaultValue("")]
    [RefreshProperties(RefreshProperties.All)]
    [TypeConverter(typeof(StringConverter))]
    public object Value { get; set; }

    public override string ToString();
}

Он реализует System.ICloneable, но там нет метода Clone().

Может кто-нибудь объяснить это?

Ответы [ 2 ]

5 голосов
/ 26 августа 2009

В .NET вы можете явно реализовать элементы интерфейса, используя следующий синтаксис:

объект System.IClonable.Clone () { }

В результате вы можете использовать метод только путем явного приведения к ожидаемому интерфейсу.

Также см. http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleparameter.system.icloneable.clone(VS.85).aspx

2 голосов
/ 26 августа 2009

Это приходит время от времени. :) Проверьте следующее ...

void Main()
{
    var e = new Example();
    I   i = e as I;

    e.m1();  // prints Class m1()
    i.m1();  // prints Interface m1()
}

public interface I
{
  void m1();
}

public class Example : I
{
  public void m1()
  {
    Console.WriteLine( "Class m1()" );
  }

  void I.m1()
  {
    Console.WriteLine( "Interface m1()" );
  }
}
...