一个简单的泛型方法问题

挨踢直男 2010-08-27 01:36:49
    protected string SwitchLink<T,T1>(T id,T1 houseSort )
{
if (houseSort == "出售")
{
return "SaleView.aspx?ID=" + id;
}
else
{
return "LeaseView.aspx?ID" + id;
}
}



调用
<%# SwitchLink<int,string>((int)Eval("ID"),Eval("House_Sort").ToString()) %>


但为什么会报错
CS0019: 运算符“==”无法应用于“T1”和“string”类型的操作数

T1 不是在调用的时候声明成string了吗
...全文
284 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
加油馒头 2010-08-30
  • 打赏
  • 举报
回复
泛型 是防止 在运行 出现错误的类型,增加类型的健壮性的
  • 打赏
  • 举报
回复
另外我要说一下,
if (houseSort.ToString() == "出售")
这叫啥代码?这种程序员该下岗重新培训。

一个不确定的类型,你敢胡乱就写ToString?你确定它返回什么?
  • 打赏
  • 举报
回复
[Quote=引用楼主 aspwebchh 的回复:]
但为什么会报错XML codeCS0019: 运算符“==”无法应用于“T1”和“string”类型的操作数

T1 不是在调用的时候声明成string了吗[/Quote]

c#是强类型的语言,目的是在编译时挑出尽可能多的软件设计错误。你的这个bug根本不是调用时,而是编译时错误,因为根本不知道如何编译 == 运算符。

需要为T1增加where类型约束,编译器才知道如何编译。
wanghui0380 2010-08-29
  • 打赏
  • 举报
回复
这个代码写的哈---

泛型是为了提供通用算法容器,而你内部确是使用一个特型的算法。别扭啊,太别扭了。
alan_219_2008 2010-08-28
  • 打赏
  • 举报
回复
既然是个泛型
那就是在判断(houseSort == "出售")时候 还不知道huseSort的类型
翻译器认为是T1类型的 而当你调用的时候才指明
可以用17 方法重写ToString
也可强制转换
csproj 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zwh202342 的回复:]
这么简单的东西还要重载运算符,明显是数据类型不对。这样写就可以了

protected string SwitchLink<T, T1>(T id, T1 houseSort)
{
if (houseSort.ToString() == "出售")
{
return "SaleView.aspx?ID=" + id.ToString();
}
else
……
[/Quote]
如果houseSort只可能是string的话,就用17的方法,直接把T1换成string

如果houseSort是其他类型的话, ToString()默认返回的是类型名,要使判断成立,还必须重写ToString方法
heiha008 2010-08-28
  • 打赏
  • 举报
回复
类型未确定,==范围狭窄
denbes 2010-08-27
  • 打赏
  • 举报
回复
T1 houseSort
T1不知道是什么类型吗.
可以改成这样
protected string SwitchLink<T,string>(T id,string houseSort )
{
if (houseSort == "出售")
{
return "SaleView.aspx?ID=" + id;
}
else
{
return "LeaseView.aspx?ID" + id;
}
}
T输出时默认转成string
zwh202342 2010-08-27
  • 打赏
  • 举报
回复
这么简单的东西还要重载运算符,明显是数据类型不对。这样写就可以了

protected string SwitchLink<T, T1>(T id, T1 houseSort)
{
if (houseSort.ToString() == "出售")
{
return "SaleView.aspx?ID=" + id.ToString();
}
else
{
return "LeaseView.aspx?ID" + id.ToString();
}
}
happyer_longlong 2010-08-27
  • 打赏
  • 举报
回复
重载运算符 
  • 打赏
  • 举报
回复
用Equals()试试,object类型都会继承有此方法
csproj 2010-08-27
  • 打赏
  • 举报
回复
你都用
houseSort == "出售"
那T1直接写成string得了。


或者写一个接口 IEqualToString
然后这个接口必须重载 ==

然后
protected string SwitchLink<T,T1>(T id,T1 houseSort ) where T1 : IEqualToString
jbo126 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 aspwebchh 的回复:]
那什么时候才算调用啊? 想不明白啊
[/Quote]
就是程序运行的时候,什么时候程序运行到这个方法,并传递了参数就知道了!
wuyq11 2010-08-27
  • 打赏
  • 举报
回复
if (houseSort.ToString.Equals("出售")){}
无法确定类型
判断类型Type t = typeof(T);
http://msdn.microsoft.com/zh-cn/library/twcad0zb(v=VS.90).aspx
挨踢直男 2010-08-27
  • 打赏
  • 举报
回复
那什么时候才算调用啊? 想不明白啊
jbo126 2010-08-27
  • 打赏
  • 举报
回复
楼上的,这个时候还没调用呢,当然不知道是什么类型了,
挨踢直男 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jjx0224 的回复:]

if (houseSort == "出售")
这个时候还不知道houseSort类型是什么
[/Quote]为什么啊
Peter200694013 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jjx0224 的回复:]
if (houseSort == "出售")
这个时候还不知道houseSort类型是什么
[/Quote]

对的...
如果这么写,通不过编译
因为不能确定T1类型是否有重载了 == ,也就是不知道可不可以使用 == 运算符
Jason-Jin 2010-08-27
  • 打赏
  • 举报
回复
if (houseSort == "出售")
这个时候还不知道houseSort类型是什么
claymore1114 2010-08-27
  • 打赏
  • 举报
回复
T,T1 哪来的,这个 要声明泛型类的吧?
可以用 委托代替
如下:

public static Func<int, string, string> FromatUlr = (id, houseSort) =>
{
if (houseSort == "出售")
return "SaleView.aspx?ID=" + id;
else
return "LeaseView.aspx?ID" + id;
};
加载更多回复(4)

111,116

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧