error? in CLR via c#

the book said:

Comparing Two Generic Type Variables with Each Other
Comparing two variables of the same generic type is illegal if the generic type parameter is not
known to be a reference type.
private static void ComparingTwoGenericTypeVariables<T>(T o1, T o2) {
if (o1 == o2) { } // Error
}
In this example, T is unconstrained, and whereas it is legal to compare two reference type vari-
ables with one another, it is not legal to compare two value type variables with one another unless
the value type overloads the == operator. If T were constrained to class , this code would compile,
and the == operator would return true if the variables referred to the same object, checking for
exact identity. Note that if T were constrained to a reference type that overloaded the operator ==
method, the compiler would emit calls to this method when it sees the == operator. Obviously, this
whole discussion applies to uses of the != operator too.

try

void Main()
{
    Test.test<B>(new B(), new B());
}

// Define other methods and classes here
class A {
    public static bool operator==(A x, A y) {
        return true;
    }
    public static bool operator!=(A x, A y) {
        return false;
    }
}
class B : A {
    public static bool operator==(B x, B y) {
        return false;
    }
    public static bool operator!=(B x, B y) {
        return true;
    }
}
class Test {
    public static void test<T>(T a, T b) where T : class {
        Console.WriteLine(a == b);
    }
}

result:false

IL:

Test.test:
IL_0000:  nop
IL_0001:  ldarg.0
IL_0002:  box         01 00 00 1B
IL_0007:  ldarg.1
IL_0008:  box         01 00 00 1B
IL_000D:  ceq
IL_000F:  call        System.Console.WriteLine
IL_0014:  nop
IL_0015:  ret         

but

public static void test<T>(T a, T b) where T : A { 
Test.test:
IL_0000:  nop
IL_0001:  ldarg.0
IL_0002:  box         01 00 00 1B
IL_0007:  ldarg.1
IL_0008:  box         01 00 00 1B
IL_000D:  call        UserQuery+A.op_Equality
IL_0012:  call        System.Console.WriteLine
IL_0017:  nop
IL_0018:  ret  
时间: 2024-10-14 12:53:35

error? in CLR via c#的相关文章

Windbg 调试 SOS 版本问题

程序发生了崩溃,我抓了一个mini Dump,Mini dump 有一个优点就是非常的小.比full dump 要小很多. 0:020> .loadby sos clr //首先加载sos 0:020> !threads The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you

C++ win32 dll 引用外部CLR,加载托管程序集异常-Error 10 error LNK2019: unresolved external symbol _CLRCreateInstancet

异常: Error 10 error LNK2019: unresolved external symbol [email protected] referenced in function "unsigned long __stdcall StartTheDotNetRuntime(void *)" ([email protected]@[email protected]) E:\C++\VC项目\NativeDll\NativeDll.obj NativeDll 解决措施: nat

C++工程编译之“error LNK2001: 无法解析的外部符号”

今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是,如果使用的第三方函数库编译方式采用/MD,那么主工程也应该使用/MD.我使用了libevent,而主工程默认采用/MT,所以需要忽略一大堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了. 下面引用一篇文章的描述:[Z]VC运行库版本不同导致链接.LIB静态库时发生重复定义

sql CLR

1.什么是SQLCLR SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,使得.NET代码可在SQL Server服务器进程中执行. 通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),开发人员可以在托管代码中编写存储过程.触发器.用户定义函数.用户定义类型和用户定义聚合函数, 改变了以前只能通过T-S

Windbg CLR基础小测 《第六篇》

首先写一段代码如下: namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.WriteLine("Hello, Windbg!"); Console.ReadKey(); } } } 在Debug目录中启动该程序,然后在Debug中附加该进程. 0:007> .load C:/WINDOWS/Microsoft.NET/Framework/v4.0.303

Lua与.net的CLR相互调用

工程环境搭建: 下载luainterface-1.5.3.zip文件,使用到的dll为Built目录下的LuaInterface.dll.lua51.dll.luanet.dll LuaInterface.dll为C#的dll,需要引用到工程中 lua51.dll.luanet.dll为C++的dll,需要拷贝到工程的输出目录下(Debug) C#调用Lua需要使用:LuaInterface.dll和lua51.dll Lua调用C#的类需要使用:LuaInterface.dll和luanet.

读书笔记—CLR via C#异常和状态管理

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 Tips vs调试catch块时,监视窗口变量: $exception 查看当前抛出的异常对象 异常的catch是自上而下,回溯调用栈,如果未找到,就抛出未处理异常 异常的执行顺序:先执行body,再执行catch,最后执行finally 堆栈

SQL触发器与CLR的使用

在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例 测试案例的业务是:我有两张表分别命名为A,B,当我在A表中插入一条数据时,这时我希望将插入的记录中的某些字段插入到B表中.很明显,很快我们会想到触发器,其实这个业务并不复杂,我们在一个触发器中就可以轻松实现,但是基于此篇博文的目的,我把向B表插入数据的功能放到了程序集里面,也就是我们的C#程序中.废话不多说,我们接

HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)

IE8报错误: 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0E)时间戳: Mon, 13 Oct 2014 00:54:55 UTC 消息: HTML P