当前位置:  开发笔记 > 编程语言 > 正文

为什么Roslyn不会为方法统一引发错误?

如何解决《为什么Roslyn不会为方法统一引发错误?》经验,为你挑选了1个好方法。

如果您尝试实现两个可能"统一"某些类型参数的接口,Roslyn将抛出一个错误:

public interface IFoo
{
    void Method(T1 a, T2 b);
}

public class Foo : IFoo, IFoo
{
    public void Method(T2 a, T1 b) { }
    public void Method(T1 a, T2 b) { }
}

Foo类不会编译,Roslyn会给你一个错误,说" Foo不能同时实现这两个IFoo,IFoo因为它们可能会统一某些类型参数替换." 尽管对于大多数类型的替换都很好,但Roslyn不会让你甚至宣布这个类,因为有人可能会使用T1 == T2的类型替换.

但是,编译器让你声明这个没有问题:

public class Bar
{
    public void Method(T1 t) { }
    public void Method(T2 t) { }
}

这个类编译得很好,只有在客户端尝试调用该方法时才会抛出错误:

var bar = new Bar();
bar.Method(5);

Roslyn在这里给出了一个错误:"这个调用在以下方法或属性之间是不明确的:Bar.Method(T1)Bar.Method(T2)."

我想知道为什么在这两种非常类似的情况下编译器的行为方式如此不同.一旦声明两个可能统一的方法,编译器是否应该抛出错误?



1> user4003407..:

Bar.Method可以调用每个单独的方法:

public class Bar {
    public void Method(T1 t) {
        Console.WriteLine("FirstMethod");
    }
    public void Method(T2 t) {
        Console.WriteLine("SecondMethod");
    }
}
public static void CallFirstMethod(Bar bar, T1 t) {
    bar.Method(t);
}
public static void CallSecondMethod(Bar bar, T2 t) {
    bar.Method(t);
}
public static void Test() {
    var bar = new Bar();
    CallFirstMethod(bar, 5);
    CallSecondMethod(bar, 6);
}

因此,在这种情况下没有理由产生错误.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有