尝试在类上定义约束,但得到错误:
public class Utilities3<T> where T : IComparable
{
public T Max<T>(T a, T b)
{
return a.CompareTo(b) > 0 ? a : b;
}
}
&#39; T&#39;不包含&#39; CompareTo&#39;的定义没有扩展方法&#39; CompareTo&#39;接受第一个类型&#39; T&#39;可以找到(你错过了使用指令或程序集引用吗?)
无法解析符号&#39; CompareTo&#39;
虽然对功能的约束很好:
public class Utilities2<T>
{
public T Max<T>(T a, T b) where T : IComparable
{
return a.CompareTo(b) > 0 ? a : b;
}
}
为什么限制课不起作用?
答案 0 :(得分:7)
问题在于您已对方法重新定义T
并隐藏了在课程中定义的T
。因此,您需要对方法进行约束,或者您不应该重新定义泛型类型。
public class Utilities3<T> where T : IComparable
{
public T Max(T a, T b)
{
return a.CompareTo(b) > 0 ? a : b;
}
}
您通常只在类或其方法上定义泛型类型。如果出于某种原因你确实需要在两个地方定义它们,那么除非你特别想要隐藏行为,否则最好给它们提供唯一的名称,但这种情况不太可能。
答案 1 :(得分:4)
这行代码:
public T Max<T>(T a, T b)
定义一个新的&lt; T&GT;覆盖用于该类的约束。删除此&lt; T&GT;在方法中,您将使用类约束
答案 2 :(得分:0)
在方法级别而不是类级别定义泛型是有意义的。例如:
static void Main(string[] args)
{
RegistryKey Install = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
//string ToolKit = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
string AtStart = "ValueName";
string Value = @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe";
if (Install.GetValue(AtStart, Value).ToString() == null)
{
Install.SetValue(AtStart, @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe", RegistryValueKind.String);
//Registry.SetValue(ToolKit, AtStart, @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe");
}
else
{
Install.SetValue(AtStart, @"C:\Program Files\SystemFolder\ToolFolder\Toolname.exe", RegistryValueKind.String);
}
}
这允许根据方法设置类型约束,而不是尝试使用public class Utilities
{
public T Max<T>(T a, T b) where T : IComparable
{
return a.CompareTo(b)>0 ? a : b;
}
public bool Equals<T>(T a, T b) where T : IEquatable<T>
{
return a!=null ? a.Equals(b) : b==null;
}
}