为什么在方法定义中使用“Where”子句

时间:2015-01-22 11:41:17

标签: c# casting where-clause

我今天遇到了一些代码,我试图了解并使用"其中:class"在方法定义中。

代码明显简化。

    private class Test
    {
        public int A { get; set; }
        public int B { get; set; }
    }

    private AB Invoke<AB>() where AB : class
    {
        return new Test() as AB;
    }

    private object RunMethod()
    {
        return new Test();
    }

通过以下方式调用每个方法。

// Method1
Test ResultTest = Invoke<Test>();

// Method2
Test ResultTest = RunMethod() as Test;

除了不必投射或使用&#34;以及#34;还有其他任何优点吗? 这叫什么呢?

4 个答案:

答案 0 :(得分:2)

as关键字提供安全转换。如果无法投放对象,则会返回null

另一方面,

where是泛型类型约束。它将确保您在使用此泛型时使用正确的类型,或者您的代码不会编译

答案 1 :(得分:1)

省略where AB : class会给你编译错误“类型参数'AB'不能与'as'运算符一起使用,因为它没有类类型约束,也没有'class'约束”

as中的as T运算符要求T为引用或可空类型。

答案 2 :(得分:0)

类定义中的

where是一种为提供给类的任何泛型参数提供编译时检查的方法。它只是确保任何错误的使用都会阻止代码编译,而不是让它在运行时失败。

答案 3 :(得分:0)

有时您需要对通用参数执行操作,在某些情况下,编译器需要知道此通用参数支持这些操作。 “Where”语句告诉编译器有关泛型参数的类型。

例如,在您的情况下,您可以执行以下操作:

private class Test
{
    public int A { get; set; }
    public int B { get; set; }
}

private AB Invoke<AB>() where AB : new ()
{
    return new AB();
}

你可以使用:

Test ResultTest = Invoke<Test>();

无需任何地方。这是可能的,因为我添加了“Where:new()”语句。

“Where:class”告诉传递的参数是一个类(不是结构,值类型,接口或其他非类的东西)。