C# 泛型类中的隐式类型参数

C# 泛型类中的隐式类型参数,c#,generics,C#,Generics,假设我有带有强类型参数的ViewModels 我使用NavigationService,它接受页面类型作为参数, 将不正确类型的参数传递给Navigate方法时。 然后我希望编译器抛出一个错误 到目前为止,我已经写了以下内容: interface IPageViewModel<TParameter> void Navigate<TViewModel, TParameter>(TParameter argument) where TVie

假设我有带有强类型参数的ViewModels 我使用NavigationService,它接受页面类型作为参数, 将不正确类型的参数传递给Navigate方法时。 然后我希望编译器抛出一个错误

到目前为止,我已经写了以下内容:

interface IPageViewModel<TParameter>    

void Navigate<TViewModel, TParameter>(TParameter argument) 
            where TViewModel : IPageViewModel<TParameter>;

class PageWithStringParameter : IPageViewModel<string>
界面IPageViewModel 无效导航(TParameter参数) 其中TViewModel:IPageViewModel; 类PageWithStringParameter:IPageViewModel 为什么这不起作用

navigationService.Navigate<PageWithStringParameter>("some string");
navigationService.Navigate(“某些字符串”);
如果我将PageWithStringParameter作为TViewModel参数传递,TParameter必须是string类型,因为它实现了IPageViewModel。 传递TParameter类型参数是多余的

有没有办法,如何避免写这样的话:

navigationService.Navigate<PageWithStringParameter, string>("some string");
navigationService.Navigate(“某些字符串”);

编译器错误非常令人困惑,特别是如果我还有NavigateMethod的无参数重载方法
Navigate
有两个通用的两种类型参数。您只提供了一个。不能部分指定类型参数。您可以指定它们中的任何一个,或者它们中没有一个(所有都应该在这种情况下隐式解析)

您可以考虑的一种接口方法是在没有参数的情况下进行导航,返回如下的操作对象:

public class Operations<TViewModel>
{
    void To<TParameter>(TParameter argument);
}

Operations<TViewModel> Navigate<TViewModel>();
公共类操作
{
无效至(t参数参数参数);
}
操作导航();
因此,您可以这样调用该操作:

navigationService.Navigate<PageWithStringParameter>().To("some string");
navigationService.Navigate().To(“某个字符串”);

不幸的是,您失去了使用“where”子句限制类型的能力,但您可以使用代码来实现这一点。

当您实际上只需要一个参数时,为什么要创建具有两个参数的泛型方法?因为我希望这会导致编译器错误:navigationService.Navigate(123);但是我想要这个:navigationService.Navigate(“一些字符串”);导航到PageWithStringParameter的Instance并传递“某些字符串”argument@Liero
Navigate(123)
为您提供编译时间error@Sergey:我知道:)同时指定参数的类型对我来说似乎是多余的,因为它可以从PageWithStringParameter插入。如前所述,可以指定所有类型参数,也可以不指定任何类型参数。可能无法简化我的导航方法。此代码根本不限制参数类型。你不想去哪里吗?