gpt4 book ai didi

c# - C# 中接口(interface)成员的访问修饰符

转载 作者:可可西里 更新时间:2023-11-01 03:04:35 25 4
gpt4 key购买 nike

我从以下属性中收到编译错误。
错误是:

"The modifier 'public' is not valid for this item"

public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}

但是如果我删除 IWorkItemControl 它编译正常。

为什么我会收到此错误以及在签名中包含/不包含接口(interface)名称有什么区别?

最佳答案

Explicit interface implementation不允许您指定任何访问修饰符。当您显式实现接口(interface)成员时(通过在成员名称之前指定接口(interface)名称),您可以仅使用该接口(interface) 访问该成员。基本上,如果您这样做:

System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}

你不能这样做:

MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface

EII 有多种用例。例如,您想为您的类提供一个Close 方法来释放获取的资源,但您仍然想实现IDisposable。你可以这样做:

class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}

这样,类的使用者只能直接调用Close(他们甚至不会在 Intellisense 列表中看到 Dispose),但您仍然可以使用 在需要 IDisposable 的地方测试 类(例如在 using 语句中)。

EII 的另一个用例是为两个接口(interface)提供同名接口(interface)成员的不同实现:

interface IOne {
bool Property { get; }
}

interface ITwo {
string Property { get; }
}

class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}

如您所见,如果没有 EII,甚至不可能在单个类中实现此示例的两个接口(interface)(因为属性只是返回类型不同)。在其他情况下,您可能希望通过不同的接口(interface)有意为类的各个 View 提供不同的行为。

关于c# - C# 中接口(interface)成员的访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1077816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com