Getter和setter来自不同的界面

Are*_*rek 21 c# interface

我真的需要这样的东西:

interface IReadableVar
{
    object Value { get; }
}

interface IWritableVar
{
    object Value { set; }
}

interface IReadableWritableVar : IReadableVar, IWritableVar
{
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用时,IReadableWritableVar.Value我得到编译错误,除非我明确地转换为基接口,如下所示:

static void Main()
{
    IReadableWritableVar var = null;
    var t = var.Value;  // <-- CS0229: Ambiguity between 'IReadableVar.Value' and 'IWritableVar.Value'
    var.Value = null;   // <-- CS0229: Ambiguity between 'IReadableVar.Value' and 'IWritableVar.Value'

    var v = ((IReadableVar)var).Value;  // compiles fine
    ((IWritableVar)var).Value = null;   // compiles fine
}
Run Code Online (Sandbox Code Playgroud)

为什么我会得到这些错误,尽管编译器应该清楚一切?除了强制转换(应用程序中有数百个位置)之外,有没有办法解决这个问题?

更新:有人建议这是实现2个具有"相同名称"属性的接口,但这有点不同,因为在其他情况下接口中没有继承.无论如何,问题现在解决了 - 看到接受的答案.

Ale*_*ria 15

可能的解决方法是修改您的界面,IReadableWritableVar如下所示:

interface IReadableWritableVar : IReadableVar, IWritableVar
{
    new object Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但请保持我的有效实现应该是:

class ReadableWritableVar : IReadableWritableVar
{
    public object Value
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }

    object IWritableVar.Value
    {
        set { throw new NotImplementedException(); }
    }

    object IReadableVar.Value
    {
        get { throw new NotImplementedException(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

一个更具体的例子:

class ReadableWritableVar : IReadableWritableVar
{
    public object Value
    {
        get { return ((IReadableVar)this).Value; }
        set { ((IWritableVar)this).Value = value; }
    }

    object _val;

    object IWritableVar.Value { set { _val = value; } }

    object IReadableVar.Value => _val;
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

class ReadableWritableVar : IReadableWritableVar
{
    public object Value { get; set; }

    object IWritableVar.Value { set { Value = value; } }

    object IReadableVar.Value => Value;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意:您不需要显式实现.`class ReadableWritableVar:IReadableWritableVar {public object Value {get; 组; `编译好. (2认同)

Che*_*hen 7

有趣的问题.我认为扩展方法在这种情况下会有所帮助.

public static class Extension
{
    public static object GetValue(this IReadableVar v)
    {
        return v.Value;
    }

    public static void SetValue(this IWritableVar v, object value)
    {
        v.Value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要更改代码才能使用它:

IReadableWritableVar variable = null;
var t = variable.GetValue();
variable.SetValue(null);
Run Code Online (Sandbox Code Playgroud)

扩展方法为您执行转换.