gpt4 book ai didi

c# - 为什么 Roslyn 不会抛出方法统一错误?

转载 作者:行者123 更新时间:2023-12-03 23:27:30 26 4
gpt4 key购买 nike

如果您尝试实现两个可能“统一”特定类型参数集的接口(interface),Roslyn 将抛出错误:

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

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

Foo 类不会编译,Roslyn 会给您一个错误,提示“Foo<T1, T2> 无法同时实现 IFoo<T1, T2>IFoo<T2, T1>,因为它们可能会统一某些类型参数替换。”尽管对于大多数类型替换来说都很好,但 Roslyn 甚至不会让您声明此类,因为有人可能会使用 T1 == T2 的类型替换。

但是,编译器可以让您声明此内容:

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

此类可以正常编译,并且仅在客户端尝试调用该方法时才会抛出错误:

var bar = new Bar<int, int>();
bar.Method(5);

此处 Roslyn 给出错误,指出“此调用在以下方法或属性之间不明确: Bar<T1, T2>.Method(T1)Bar<T1, T2>.Method(T2) 。”

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

最佳答案

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

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

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

关于c# - 为什么 Roslyn 不会抛出方法统一错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com