【问题标题】:Are constraints taken into account while resolving generic method signature?解析通用方法签名时是否考虑了约束?
【发布时间】:2012-10-30 16:47:05
【问题描述】:

假设:

public class GenericMethods
{
    public T Method<T>() where T : struct
    {
        // Do something specific to a struct
    }

    public T Method<T>() where T : class
    {
        // Do something specific to a class
    }
}

在编译时不知何故无效,因为这两个方法采用相同的参数。但是,由于约束是互斥的,这两种方法是否真的会发生冲突?解决 T 时软件可能无法选择两种方法之一吗?

如果泛型类型是结构或类,那么如何创建两个具有相同名称和参数的泛型方法?

【问题讨论】:

    标签: c# generics methods signature


    【解决方案1】:

    没有。不考虑约束。也不是返回类型。这不会编译,并且是不合法的 C#。

    这在 C# 语言规范的 3.6 中有记录:

    方法的签名具体不包括返回类型、可能为最右边的参数指定的 params 修饰符,也不包括可选的类型参数约束。

    虽然这两种方法在“逻辑上”是不同的,并且不能冲突,因为约束应该清楚地表明了正在调用的方法,但 C# 语言不支持这一点。语言设计者认为这是他们选择实现 C# 规则的方式。

    【讨论】:

    • 您还没有阅读全文,是吗?我知道它无效,我知道它无法编译。
    • @Marc-AndréJutras 你不能制作两个版本,但编译器实际上并没有考虑这个,运行时也不支持它。虽然理论上可能可以这样写,但事实并非如此。
    • 那么“如果泛型类型是结构或类,那么如何创建两个具有相同名称和参数的泛型方法?”不可能吧?
    • @Marc-AndréJutras 是的。 C# 不支持它。
    【解决方案2】:

    你可能也有类似的方法

     public MyClass Method<T>() 
        {
            // Do something specific to a myclass
        }
    

    所以编译器不会有明确的选择。

    【讨论】:

    • 我认为编译器没有考虑方法签名的返回类型?
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多