除非泛型类型被明确设置,否则不会调用Nullable 的扩展方法(Extension method on Nullable not called unless generic type is set explicitly)
在调查另一个问题时:“ 为什么没有Nullable <T> .Equals(T值)方法? ”我在
Nullable<T>
上做了一个扩展方法,揭示了泛型Equals<T>(T)
public static class NullableExtensions { public static bool Equals<T>(this T? left, T right) where T : struct, IEquatable<T> { if (!left.HasValue) return false; return right.Equals(left.Value); } }
但是,这样调用它:
double? d = null; d.Equals(0.0);
使用boxing调用基本
Equals(object)
,就像你在IL中看到的那样:IL_0000: nop IL_0001: ldloca.s d IL_0003: initobj valuetype [mscorlib]System.Nullable`1<float64> IL_0009: ldloca.s d IL_000b: ldc.r8 0.0 IL_0014: box [mscorlib]System.Double IL_0019: constrained. valuetype [mscorlib]System.Nullable`1<float64> IL_001f: callvirt instance bool [mscorlib]System.Object::Equals(object)
如果我将该调用更改为明确声明泛型类型:
d.Equals<double>(0.0);
它调用我的扩展方法:
IL_0000: nop IL_0001: ldloca.s d IL_0003: initobj valuetype [mscorlib]System.Nullable`1<float64> IL_0009: ldloc.0 IL_000a: ldc.r8 0.0 IL_0013: call bool ConsoleApplication8.NullableExtensions::Equals<float64>(valuetype [mscorlib]System.Nullable`1<!!0>, !!0)
为什么编译器不会在
Equals(object)
方法上选择扩展方法?是因为我刚刚选择了
Equals<T>(T)
的差方法名称,它实际上并不是Equals
的真正覆盖,也不是继承查找的一部分?While investigating another question: "Why there is no Nullable<T>.Equals(T value) method?" I made an extension method on
Nullable<T>
that exposed a genericEquals<T>(T)
method:public static class NullableExtensions { public static bool Equals<T>(this T? left, T right) where T : struct, IEquatable<T> { if (!left.HasValue) return false; return right.Equals(left.Value); } }
However, calling it like so:
double? d = null; d.Equals(0.0);
Calls into the base
Equals(object)
with boxing, as you can see in the IL:IL_0000: nop IL_0001: ldloca.s d IL_0003: initobj valuetype [mscorlib]System.Nullable`1<float64> IL_0009: ldloca.s d IL_000b: ldc.r8 0.0 IL_0014: box [mscorlib]System.Double IL_0019: constrained. valuetype [mscorlib]System.Nullable`1<float64> IL_001f: callvirt instance bool [mscorlib]System.Object::Equals(object)
If I change the call to explicitly state the generic type:
d.Equals<double>(0.0);
It calls my extension method:
IL_0000: nop IL_0001: ldloca.s d IL_0003: initobj valuetype [mscorlib]System.Nullable`1<float64> IL_0009: ldloc.0 IL_000a: ldc.r8 0.0 IL_0013: call bool ConsoleApplication8.NullableExtensions::Equals<float64>(valuetype [mscorlib]System.Nullable`1<!!0>, !!0)
Why does the compiler not choose the extension method over the
Equals(object)
method?Is it because I've just chosen a poor method name of
Equals<T>(T)
where it isn't actually a true override ofEquals
and not part of the inheritance look-up?
原文:https://stackoverflow.com/questions/18736146
最满意答案
JBehave has its own mechanism for writing parameterized tests. I recommend using that, rather than combining JBehave with TestNG's DataProvider feature.
相关问答
更多-
从JBehave的FAQ : 使用TestNG运行的一个快速解决方法就是使用TestNG @Test注释简单地在根JUnitStory / Stories类中注释run()方法: public class YourStory extends JUnitStory/Stories { @org.testng.annotations.Test public void run() throws Throwable { super.run(); } } 请注意,这只是运 ...
-
与DataProvider绑定时,Testng @Factory方法失败(Testng @Factory method fails when tied with a DataProvider)[2022-10-19]
遇到了问题。 Factory方法的返回类型应为Object [] Got the problem. The return type of the Factory method should be Object[] -
TestNG“@before”方法不能直接与@DataProvider一起使用。 @BeforeMethod可以访问参数列表( TestNG - 5.18.1 - 本机依赖注入 ): 任何@BeforeMethod都可以声明Object[]类型的参数。 此参数将接收即将提供给即将到来的测试方法的参数列表,该测试方法可以由TestNG注入,例如java.lang.reflect.Method也可以来自@DataProvider 但是@BeforeMethod “将在每个测试方法之前运行”,你想要的更像@Bef ...
-
如何从testng数据提供者检索特定行数据?(How do I retrieve a specific row of data from a testng dataprovider?)[2022-01-16]
其中一种方式可能是 - 您保留一个计数器并检查是否已达到目标数据,然后执行任务。 演示代码: public class TestDemo { public static int count = 0; DataProvider(name = "therapistToDoList") public static Object[][] data(){ return new Object[][]{ {"06012017", " ... -
组织JBehave故事(Organising JBehave stories)[2022-08-17]
@MrWiggles 正如t0rx告诉你很幸运有QA来编写故事/场景。 提出你的问题: 行为驱动开发鼓励您通过以文本格式表达所需行为的场景来开始定义故事。 您可以通过在Maven(pom.xml)中配置来运行JBehave Stories。 您可以创建一个文件夹,用于在包结构中存储您的故事文件,如下所示: Your_Project | | |--Source_Code | |--Stories | |--Testing ... -
JBehave有自己的编写参数化测试的机制 。 我建议使用它,而不是将JBehave与TestNG的DataProvider功能结合使用。 JBehave has its own mechanism for writing parameterized tests. I recommend using that, rather than combining JBehave with TestNG's DataProvider feature.
-
@DataProvider是将参数传递给方法的方法之一。 您不能同时使用两种方法。 查看您的问题,您只需将品牌添加到DataProvider方法,例如, @DataProvider(name="dpCGA") public Object[][] data() { return new Object[][] { {"brand", "email1"}, {"brand", "email2"} }; } 并将其传递给方法, @Test(dat ...
-
当数据提供者接受Iterator
-
我最近不得不做类似的事情并且惊喜地发现它是NBD。 有关如何设置JBehave的示例代码, 请参阅我对另一个SO JBehave问题的回答 。 从那里,只需为您的JBehave测试创建一个testNG套件文件,如下所示:看看TestNG工厂 。 例如 import org.testng.annotations.DataProvider; import org.testng.annotations.Factory; import org.testng.annotations.Test; import java.util.Arrays; import java.util.Iterator; public class DemoTest { private final String url; @Factory ...
相关文章
更多- getOutputStream() has already been called for this response 问题
- 7月最新发布11.2.0.1.2 Patch set update
- Solr Cache使用介绍及分析,包括LRUCache、filterCache、queryResultCache、documentCache、Generic Caches
- 研磨设计模式之工厂方法模式(Factory Method)-模式讲解3
- ServletOutputStream cannot be resolved to a type
- HTTP Content-Type 内容类型详解
- 研磨设计模式之工厂方法模式(Factory Method)-模式讲解2
- Memcached set 添加或更新数据命令
- Memcached CAS(Check-And-Set)原子操作
- 研磨设计模式之工厂方法模式(Factory Method)-模式讲解1
最新问答
更多- 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
- 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
- OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
- 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
- codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
- 在计算机拍照在哪里进入
- 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
- No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
- 单页应用程序:页面重新加载(Single Page Application: page reload)
- 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
- System.StackOverflow错误(System.StackOverflow error)
- KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
- 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
- android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
- TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
- 企业安全培训的各项内容
- 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
- C#类名中允许哪些字符?(What characters are allowed in C# class name?)
- NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
- 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
- 将多个行和可变行移动到列(moving multiple and variable rows to columns)
- 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
- 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
- Angular $资源不会改变方法(Angular $resource doesn't change method)
- 在Angular 5中不是一个函数(is not a function in Angular 5)
- 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
- 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
- 常见的python rpc和cli接口(Common python rpc and cli interface)
- Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
- 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)