我无法理解这个概念。
假设我有这个界面:
public interface IValidate
{
Dictionary<eValidationErrors, List<string>> ValidationMessages { get; }
}
当我说:
时会发生什么 var Validator = control as IValidate;
Validator.ValidationMessages.Add(key,list);
什么是验证者?为什么我可以这样使用界面?
谢谢
答案 0 :(得分:5)
Validator
是实现IValidate
接口的类型的实例(如果control
实例未实现IValidate
接口,则为null)。
如果您对某个实例的实际或精确实现不感兴趣,但是如果您想使用该界面提供的功能,那么这样做很有帮助。
考虑.NET框架本身的一些方法,它们接受一个接口参数 - 类型。该方法对类型本身不感兴趣;它只需要确保传递的参数具有由指定接口声明的某些方法/属性/等...
答案 1 :(得分:3)
as
运算符会将右侧转换为IValidate
,因此Validator
的类型为IValidate
。
换句话说,您的代码与:
相同IValidate Validator = control as IValidate;
您的问题似乎是
为什么我可以这样使用界面?
但我无法理解为什么你认为这段代码会以任何其他方式运行。也许这种脱节可能是你还不熟悉在C#中使用var
。如果是这样,我确信快速阅读documentation将使一切都清楚。
可以为局部变量提供var的推断“类型”而不是显式类型。 var关键字指示编译器从初始化语句右侧的表达式推断变量的类型。
请注意,var
变量与显式类型变量之间的类型安全性没有差异。
答案 2 :(得分:1)
在任何给定时刻,Validator都不会保留任何内容(空值),或者实现IValidate的某种类型的实例,可以使用它作为IValidate的实例。要使用更类似于抽象类的示例,但涉及相同的原则,请考虑以下请求:
如果每辆车都有一个Tow()方法,第一个请求中的车辆类型就足以描述它来执行。另一方面,第二种方法中的车型太模糊而无法使用。如果提供了具有相关默认参数的类型,则不一定必须提供所需对象的绝对完整描述。例如,如果指定了ToyotaCamry,那么该类型可能具有相关的默认年份,颜色,体型,选项包等。另一方面,仅仅说一个人想要车辆会太开放-ended。
答案 3 :(得分:0)
您可以将它用作控件对象实现IValidate。因此,使用var可以将该对象的接口部分转换为Validator。
答案 4 :(得分:0)
var
表示类型将具有隐式类型。重要的是要理解var关键字并不意味着“变体”,并不表示变量是松散类型或后期绑定。它只是意味着编译器确定并分配最合适的类型。
因此,如果您使用var Validator = control as IValidate;
,验证者的类型将是IValidate。
答案 5 :(得分:0)
接口通常提供用于与对象通信的协议。因此,将对象转换为符合该协议的接口,因此您只能将其称为公开声明的成员。