c# - 这个 C# 语法有什么作用?

标签 c# generics type-constraints

我正在阅读一篇关于移动网络开发和 ASP.NET MVC 的文章:http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx .

在这篇文章中,Scott Hanselman 介绍了创建自己的 View 引擎以根据是否从移动网络浏览器请求站点来呈现不同 View 的过程。

在他的MobileHelpers 类中,他有几个方法的签名对我来说很陌生。这是一个例子:

        public static void AddMobile<T>(this ViewEngineCollection ves, Func<ControllerContext, bool> isTheRightDevice, string pathToSearch)        
        where T : IViewEngine, new()    
        {        
            ves.Add(new CustomMobileViewEngine(isTheRightDevice, pathToSearch, new T()));    
        }   

我已经使用过一些像这样的内联函数(我认为这就是它们的名称),但我无法理解这种逻辑。我也不明白 where T : ...... 行的目的。

你们能帮我理解这里发生了什么吗?

最佳答案

如果您能确定哪些部分特别让您感到困惑,将会有所帮助。我根据您的问题选择了我认为最有可能的两个,并进行了解释。如果有任何其他语法让您感到困惑,请编辑您的问题以解释是哪一个。

的解释,其中 T : IViewEngine, new()

C# 允许您放置 constraints关于泛型类型参数。您可以阅读有关约束的更多信息 here .

在您的特定情况下,where T : IViewEngine 意味着无论 T 是什么类型,都必须是 IViewEngine 类型的后代。 where T : new() 是一种特殊的语法,表明无论 T 是什么类型,都必须有一个默认构造函数。

这个 ViewEngineCollection ves 的解释

关键字this 表示方法AddMobileViewEngineCollection 类的扩展方法。这意味着除了被称为 AddMobile(someViewEngineCollection, ...) 之外,它还可以被称为 someViewEngineCollection.AddMobile(...)。您可以阅读有关扩展方法的更多信息 here .

关于c# - 这个 C# 语法有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861576/

相关文章:

c# - 是否有一些 Visual Studio 扩展可以检查代码是否存在潜在的线程不安全性?

generics - Scala方法,其中第二个参数的类型等于第一个参数的泛型类型的一部分

typescript - 如何在 TypeScript 中创建一个适用于数字和字符串的通用加法运算符

haskell - 类型族实例中的类型级约束

TypeScript 无法在函数类型中派生类型约束

c# - 有没有标准的方法来编写不需要更新语句的 for 循环?

c# - ActiveX 控件 '6bf52a52-394a-11d3-b153-00c04f79faa6' 无法实例化,因为当前线程不在单线程单元中

c# - 我不能使用 system.windows.control 命名空间

java - 非泛型类扩展泛型类是什么意思

c# - 如何实现可以返回类或可空结构的通用集合查找方法?