c#将var声明为接口。为什么这可能?

时间:2011-11-03 14:11:35

标签: c# interface

我无法理解这个概念。

假设我有这个界面:

    public interface IValidate 
    {
       Dictionary<eValidationErrors, List<string>> ValidationMessages { get; }
     }

当我说:

时会发生什么
          var Validator = control as IValidate;
          Validator.ValidationMessages.Add(key,list);

什么是验证者?为什么我可以这样使用界面?

谢谢

6 个答案:

答案 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的实例。要使用更类似于抽象类的示例,但涉及相同的原则,请考虑以下请求:

  1. 如果车辆在下午6点到早上8点之间停在这个空间,那么就是Tow()。
  2. 给我一个新的车辆

如果每辆车都有一个Tow()方法,第一个请求中的车辆类型就足以描述它来执行。另一方面,第二种方法中的车型太模糊而无法使用。如果提供了具有相关默认参数的类型,则不一定必须提供所需对象的绝对完整描述。例如,如果指定了ToyotaCamry,那么该类型可能具有相关的默认年份,颜色,体型,选项包等。另一方面,仅仅说一个人想要车辆会太开放-ended。

答案 3 :(得分:0)

您可以将它用作控件对象实现IValidate。因此,使用var可以将该对象的接口部分转换为Validator。

答案 4 :(得分:0)

var表示类型将具有隐式类型。重要的是要理解var关键字并不意味着“变体”,并不表示变量是松散类型或后期绑定。它只是意味着编译器确定并分配最合适的类型。

因此,如果您使用var Validator = control as IValidate;,验证者的类型将是IValidate。

答案 5 :(得分:0)

接口通常提供用于与对象通信的协议。因此,将对象转换为符合该协议的接口,因此您只能将其称为公开声明的成员。

相关问题