Tag: 隐式转换

有关C#语言规范中隐式转换的问题

6.1节隐式 转换因此定义了身份转换 : 身份转换从任何类型转换为相同类型。 存在这种转换,使得已经具有所需类型的实体可以被称为可转换为该类型。 现在,这些句子的目的是什么? (在§6.1.6隐式参考转换中) 隐式引用转换是: […] 从任何引用类型到引用类型 T如果它具有隐式标识或引用转换为引用类型 T 0并且T 0具有到T的标识转换。 和: (在§6.1.7拳击转换中) 如果值类型具有到接口类型I 0的装箱转换并且I 0具有到I的标识转换,则值类型具有到接口类型I的装箱转换。 最初它们似乎是多余的(同义词)。 但他们必须在某个目的,所以为什么他们在那里? 你能给出一个T 1 , T 2这两种类型的例子,如果不是上面引用的段落, T 1就不能隐式转换为T 2吗?

哪个Json反序列化器呈现IList 集合?

我正在尝试将json反序列化为对象模型,其中集合表示为IList类型。 实际的反序列化在这里: JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Deserialize<IList>( (new StreamReader(General.GetEmbeddedFile(“Contacts.json”)).ReadToEnd())); 在我发布exception之前,我知道你应该知道隐含的转换是什么。 这是Contact类型: public class Contact { public int ID { get; set; } public string Name { get; set; } public LazyList Details { get; set; } //public List Details { get; set; } } 这是ContactDetail类型: public class ContactDetail { public int ID { […]

将struct更改为sealed类时,隐式转换失败

有问题的结构/类: public struct HttpMethod { public static readonly HttpMethod Get = new HttpMethod(“GET”); public static readonly HttpMethod Post = new HttpMethod(“POST”); public static readonly HttpMethod Put = new HttpMethod(“PUT”); public static readonly HttpMethod Patch = new HttpMethod(“PATCH”); public static readonly HttpMethod Delete = new HttpMethod(“DELETE”); private string _name; public HttpMethod(string name) { // validation of […]

为什么C#允许* Long隐式*从Long转换为Float,这可能会失去精度?

一个类似的问题Long in Float,为什么? 这里没有回答我在寻找的东西。 C#标准允许从long到float的隐式转换。 但任何长于2 ^ 24的长度在表示为浮动时必然会失去其“价值”。 C#标准清楚地表明,长期浮动转换可能会失去“精确度”但永远不会失去“幅度”。 我的问题是 关于积分类型,“精确”和“幅度”的含义。 数字n与数字n + 1完全不同,与实数不同,其中3.333333和3.333329可能被认为足够接近计算(即取决于程序员想要的精度) 不允许隐式转换从long到浮动邀请到微妙的错误,因为它可能导致长期“默默地”失去价值(作为一个C#程序员,我习惯于编译器在防范这些问题方面做得非常出色) 那么C#语言设计团队允许这种转换是隐含的理由是什么呢? 我在这里失踪的是什么certificate从长期到浮动的隐性转换是正确的?

无法将List ‘隐式转换为’double’

继续投掷,我的代码的这部分有什么问题,当我想返回单元格时收到此错误不能隐式地将类型’System.Collections.Generic.List’转换为’double’: public double readFileToList(string Path) { var cells = new List(); string path = label3.Text; if (File.Exists(path)) { double temp = 0; cells.AddRange(File.ReadAllLines(path) .Where(line => double.TryParse(line, out temp)) .Select(l => temp) .ToList()); int totalCount = cells.Count(); cellsNo.Text = totalCount.ToString(); } return cells; }

无法将MyType 隐式转换为MyType

我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作。 这是代码: public interface IDto { } public class PaginatedDto where TDto : IDto { public int PageIndex { get; set; } public int PageSize { get; set; } public int TotalCount { get; set; } public int TotalPageCount { get; set; } public bool HasNextPage { get; set; } public bool HasPreviousPage { get; […]

使用策略模式在C#上实现多参数C ++模板行为

我正在尝试使用C#generics和基于此答案的策略模式实现类似c ++的模板 这是模式的一个示例: interface ISomePolicy { void _doSomething(U u); } class MyClass: ISomePolicy, ISomePolicy { internal T myElement {get;set;} public MyClass(T Element) { myElement = Element; } void ISomePolicy._doSomething(double u) { Console.WriteLine(“this is int, double”); } void ISomePolicy._doSomething(int u) { Console.WriteLine(“this is int, int”); } } static class MyClassExtension { //What I want to do […]

无论如何使用F#的C#隐式运算符?

如果我有一个C#类隐式转换为double,就像这样: public class Parameter { private double _value; public Parameter(double value) { _value = value } public static implicit operator double(Parameter p) { return _value; } } F#不喜欢我试图使用它,就好像它是一个float : let a = Parameter(4.0) let b = Parameter(2.0) let c = a * Math.Sin(b) <– 'expected float, here Parameter' 有没有办法做到这一点(我猜测没有,基于这个问题/答案 ),如果没有,什么是一个体面的解决方法?

等价隐式算子:为什么它们合法?

更新! 请参阅我对以下C#规范的一部分的剖析; 我想我必须遗漏一些东西,因为对我而言 ,我在这个问题中描述的行为实际上违反了规范。 更新2! 好的,经过进一步的反思,并根据一些评论,我想我现在明白了发生了什么。 规范中的“源类型”一词指的是从中转换的类型 – 即下面的示例中的Type2 – 这只是意味着编译器能够将候选缩小到两个定义的运算符(因为Type2是两种来源类型)。 但是,它无法进一步缩小选择范围。 所以规范中的关键词(适用于这个问题)是“源类型” ,我之前误解(我认为)是指“声明类型”。 原始问题 说我定义了这些类型: class Type0 { public string Value { get; private set; } public Type0(string value) { Value = value; } } class Type1 : Type0 { public Type1(string value) : base(value) { } public static implicit operator Type1(Type2 other) { […]

如何警告类型转换导致的潜在算术错误?

我正在使用C#编写计算模块,我碰到了这个: double v = 4 / 100; 我知道这是一个错误的初始化,返回v = 0.0而不是v = 0.04 c#规则说我必须确保至少有一个成员是双重的 ,如下所示: double v = (double) 4 / 100; double v = 4.0 / 100; 但是,我有很多涉及整数变量操作的初始化,我觉得懒得逐行浏览我的代码来检测这样的错误。 相反, 是否有可能被编译器警告这个?