我真的需要这样的东西:
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)
有趣的问题.我认为扩展方法在这种情况下会有所帮助.
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)
扩展方法为您执行转换.