Tag: 隐式转换

集合的隐式转换

本周我遇到了关于集合中C#的隐式转换的问题。 虽然这(使用implicit )可能不是我们的最终方法,但我想至少完成代码以提供团队作为选项。 我将问题归结为以下示例案例: 我的示例中有两个类:一个表示业务对象(Foo),另一个表示此业务项(FooVO)的客户端版本(View Object),如下所示… public class Foo { public string Id {get; set;} public string BusinessInfo {get; set;} } public class FooVO { public string Id {get; set;} public static implicit operator FooVO( Foo foo ) { return new FooVO { Id = foo.Id }; } } 我的问题是,当我有一个Foo对象列表,并希望使用我的隐式运算符将它们转换为FooVO对象列表。 List foos = GetListOfBusinessFoos(); // […]

三元条件下的隐式转换问题

可能重复: 条件运算符不能隐式转换? 为什么null需要显式类型转换? 我有一个搜索,并没有找到一个很好的解释为什么以下发生。 我有两个具有共同接口的类,我尝试使用三元运算符初始化此接口类型的实例,如下所示,但无法编译错误“无法确定条件表达式的类型,因为之间没有隐式转换’xxx.Class1’和’xxx.Class2’: public ConsoleLogger : ILogger { …. } public SuppressLogger : ILogger { …. } static void Main(string[] args) { ….. // The following creates the compile error ILogger logger = suppressLogging ? new SuppressLogger() : new ConsoleLogger(); } 如果我明确地将第一个conditioin强制转换为我的界面,这是有效的: ILogger logger = suppressLogging ? ((ILogger)new SuppressLogger()) : new ConsoleLogger(); 显然我总能做到这一点: […]

为什么不能从接口到类定义隐式转换运算符?

说,我有一个界面 public interface ISomeControl { Control MyControl { get; } … } 是否可以像这样定义smth: public static implicit operator Control(ISomeControl ctrl) { return ctrl.MyControl; } 或者更确切地说,为什么我不能在C#中这样做?

C#将隐含转换添加到现有类型

在C#中是否有一种方法可以将隐式转换添加到已在其他程序集中定义的类型中? 例如,如果我使用两个不同的程序集,每个程序集都提供自己的Vector3 struct ,并在其API中使用它,那么能够定义一次转换,然后将Foo.Vector3传递给一个方法就可以了。需要一个Bar.Vector3 ,并自动转换。 如果我有库的源,那么我可以添加隐式转换运算符。 如果没有这个来源,我现在每次都使用辅助函数显式地进行转换。 我希望有一个更好的方式。 我意识到我可以使用隐式转换运算符创建自己的Vector3 struct与其他两个结构,但这并不能解决我想直接将一个(外部定义的)类型的对象传递给期望的方法的所有情况。其他。 额外的问题 :是否有任何库的作者在其API中暴露像Vector3结构这样的东西应该做些什么来促进这方面的易用性?

我可以为两个我不直接控制的类添加隐式转换吗?

我希望能够在两个不相容的类之间隐式转换。 其中一个类是Microsoft.Xna.Framework.Vector3 ,另一个类只是F#项目中使用的Vector类。 我正在使用XNA在C#中编写一个3D游戏,并且 – 虽然它是用3D绘制的,但游戏只在两个维度上进行(它是一个鸟瞰图)。 F#类使用2D矢量处理物理: type Vector SuperUnit> = | Cartesian of ‘t * ‘t | Polar of ‘t * float member this.magnitude = match this with | Cartesian(x, y) -> x.newValue(sqrt (x.units ** 2.0 + y.units ** 2.0)) | Polar(m, _) -> m.newValue(m.units) member this.direction = match this with | Cartesian(x, y) […]

为什么从int到uint的隐式转换有效?

使用Casting null并不能作为灵感编译,而是来自Eric Lippert的评论: 这表明了一个有趣的案例。 “uint x =(int)0;” 即使int不能隐式转换为uint,也会成功。 我们知道这不起作用,因为无法将object分配给string : string x = (object)null; 但这确实如此,但直觉上它不应该: uint x = (int)0; 当int不能隐式转换为uint时,为什么编译器允许这种情况?

我应该何时在C#中定义(显式或隐式)转换运算符?

C#的一个鲜为人知的特性是可以创建隐式或显式的用户定义类型转换 。 我已经写了6年的C#代码了,我从来没有用过它。 所以,我担心我可能错过了好机会。 什么是用户定义转换的合法,良好用途? 您是否有比仅定义自定义方法更好的示例? – 事实certificate,微软有一些关于转换的设计指南 ,其中最相关的是: 如果最终用户未明确预期此类转换,请勿提供转换运算符。 但什么时候转换“预期”? 在玩具编号课程之外,我无法弄清楚任何真实世界的用例。 以下是答案中提供的示例摘要: 弧度/度/双 极地/的Point2D 开尔文/华氏/摄氏度 模式似乎是:隐式转换大多数(仅?)在定义数值/值类型时很有用,转换由公式定义。 回想起来,这很明显。 不过,我想知道非数字类是否也可以从隐式转换中受益..?

更多关于C#中的隐式转换运算符和接口(再次)

好的。 我已经读过这篇文章了,我对它如何适用于我的例子感到困惑(下图)。 class Foo { public static implicit operator Foo(IFooCompatible fooLike) { return fooLike.ToFoo(); } } interface IFooCompatible { Foo ToFoo(); void FromFoo(Foo foo); } class Bar : IFooCompatible { public Foo ToFoo() { return new Foo(); } public void FromFoo(Foo foo) { } } class Program { static void Main(string[] args) { Foo foo […]

为什么generics类型约束会导致无隐式引用转换错误?

我创建了几个用于处理议程约会的接口和generics类: interface IAppointment where T : IAppointmentProperties { T Properties { get; set; } } interface IAppointmentEntry where T : IAppointment { DateTime Date { get; set; } T Appointment { get; set; } } interface IAppointmentProperties { string Description { get; set; } } class Appointment : IAppointment where T : IAppointmentProperties { public […]

将int隐式转换为double

所以,我有点困惑。 我认为这应该有效:在这种情况下, a和b都是整数(确切地说是计数器)。 由于a / b可能包含小数位,因此int显然不起作用。 因此,我推出了一个新的双重并在其中执行计算,如下所示: double texturefactor = ((a / b) * 10); 这不像我预期的那样工作,并且a / b的结果总是如果我使用int来执行计算以存储结果的结果。 另一方面,这有效: double calculate1 = a; double calculate2 = b; double texturefactor = ((calculate1 / calculate2) * 10); 几个可能是愚蠢的问题 – 1.我确信这应该有效 – 我知道在某些情况下VS会抱怨我试图隐式地从一种类型转换为另一种类型 – 这就是我想要做的! 为什么不呢,我错过了什么? 🙂 2.我应该将计数器a和b转换成双打并为自己省去转换的麻烦,还是那个麻烦?