|
You have:
- Two dlls with the same class definition in somehow. Almost certainly the same dll twice. You'll probably will have to work out how this happened yourself.
Posted to the wrong forum: This should have been in the ASP.Net forum.- Reposted: See Mark's answer in the ASP.NET forum, his answer is the most common reason for this fault.
|
|
|
|
|
I have written a few classes to handle geometry primitives, like Length, Angle, etc, to make sure there are no unit mismatches as could happen if the values are stored in plain double types.
Coming from C++, I overloaded operator== et al, to compare the actual values, which to me would be intuitive. However, co-workers coming from Java claimed operator== should be reserved for comparing references, and that I should use Equal() and the like for comparison. The C#-ers here seems to be divided.
Is there a design guide for operator overloading in C#? How would you prefer the implementation? Operator overloading or plain old function calls?
|
|
|
|
|
I think there is not a clear rule for this. If you overload the other relational operators (<, > <=, >=) then I think that overloading == for bit equality makes sense. Rememeber you can always use the static method Object.ReferenceEquals to compare references.
|
|
|
|
|
You could always use Object.ReferenceEquals..
But, in my opinion, types like Length and Angle etc should be value types (and therefore structs, unlike in C++, in C# classes can never be value types) - they represent a value instead of a thing and in almost every situation will it be more intuitive if they also behave like values.
To counter his argument:
1) C# is not Java
2) operator== on strings compares for value-equality (even when you make sure that string-interning is avoided)
|
|
|
|
|
As long as it is clear in the documentation for your class that == does value equality checking, and that makes sense for how the class would normally be used, it is fine to do that in .Net. As mentioned below, string.== does that.
However, I also agree with the comment below that simple wrappers like that should be value types (structs).
Edit: Below=above. I forgot which way CP forums stack posts.
|
|
|
|
|
Niklas Lindquist wrote: co-workers coming from Java claimed operator== should be reserved for comparing
references
That's because Java got it wrong and they want to share the misery.
Use == for value equality in .net; it's right way, the intuitive way.
|
|
|
|
|
PIEBALDconsult wrote: That's because Java got it wrong and they want to share the misery.
Having seen some truly hideous usages of operator overloading including at least one that I wrote myself and having never seen any truly inspired usage of the same I would say that Java got it right.
So in terms of misery the win goes to C++.
|
|
|
|
|
jschell wrote: truly hideous usages of operator overloading
I would say that that describes Java.
C and C# are the only languages I consider.
|
|
|
|
|
PIEBALDconsult wrote: C and C# are the only languages I consider.
Myself I use languages that are appropriate for the job.
Those include C++, C#, Java, SQL (vendor specific implementations), Perl and various OS scripting languages.
Myself I wouldn't use C versus C++ unless forced.
Small differences in one language do not matter in terms of choice over another.
|
|
|
|
|
You can abuse almost any language feature..
The "no operator overloading" along with the "no structs" (though that one is not as bad) restrictions make it impossible to create proper new numeric types in Java, and that just sucks. It makes the predefined types more magic, and it makes working with any non-predefined numeric type a pain.
As for the abuse, sure, you can do that. You can also have overloads Foo(int) and Foo(long) and have them do something completely different - that's on the same level as operator overloading abuse, but Java still allows that. You can also override some method (accidentally even, in Java) and have it completely break the Liskov substitution principle.
|
|
|
|
|
David1987 wrote: The "no operator overloading" along with the "no structs" (though that one is
not as bad) restrictions make it impossible to create proper new numeric types
in Java, and that just sucks. It makes the predefined types more magic, and it
makes working with any non-predefined numeric type a pain.
Since the vast majority of programming in the world does not involve that it isn't a significant problem.
And since most programs that do deal with specialized numerics often have other requirements, such as performance and or significant other functionality (non-numeric) then one should either choose an appropriate language or live with the small amount of code that java entails.
The obvious analogy to that is that SQL is very poor candiate for string manipulation and regexes and thus applications used widely, such as editors, should not be written in SQL. That however doesn't mean that SQL suffers because of it.
David1987 wrote: As for the abuse, sure, you can do that. You can also have overloads Foo(int)
and Foo(long) and have them do something completely different - that's on the
same level as operator overloading abuse, but Java still allows that. You can
also override some method (accidentally even, in Java) and have it completely
break the Liskov substitution principle.
No.
It is not a question of whether abuse can happen.
The point is that it does happen.
Enough so that me and others have seen it.
And it is not accidental.
|
|
|
|
|
Congratulations, you are a troll.
|
|
|
|
|
David1987 wrote: Congratulations, you are a troll.
I see...so expressing my opinion makes me a troll while you expressing yours is just the thoughtful insight of a recognized genius?
|
|
|
|
|
It does when you're dismissing arguments out of hand and using irrelevant and nonsensical arguments to "prove" your position.
This post again proves you to be a troll.
|
|
|
|
|
|
Indeed they were not. It's not the only mistake they made. The C# creators disagreed with them.
|
|
|
|
|
David1987 wrote: It's not the only mistake they made.
Your opinion.
David1987 wrote: The C# creators disagreed with them.
Actually your opinion as well. The existence of the idiom in the language itself is not proof of your opinion. Now if you can provide a documented reference that states specifically that it was added because Java didn't have it (versus say because C++ does) then that would certainly be relevent.
Relevent of their opinion though and nothing else.
|
|
|
|
|
No. You're just talking crap here.
They didn't choose to leave operator overloading out, so they can't have seen it as a major problem.
It doesn't matter whether they specifically added it because Java didn't have it - it matters that they didn't see it as a problem. Their disagreement doesn't have to be explicit to be disagreement.
|
|
|
|
|
You specifically said.
"The C# creators disagreed with them."
That suggests intent.
1. They looked at Java, it didn't have operator overloading and thus they added it because Java didn't have it. In this case they disagreed with the the designers of Java.
2. Conversely they could have looked at C++, saw that it had operator overloading and added it because of that. In this case they agreed with the designers of C++.
1 and 2 are not the same.
|
|
|
|
|
No it does not. It means they don't share the same opinion.
|
|
|
|
|
David1987 wrote: No it does not. It means they don't share the same opinion.
Which is not the same as your previous statement when you said "The C# creators disagreed with them."
|
|
|
|
|
Also in case you hadn't noticed, a post like that is the mark of a troll. There is no doubt about it. You are purposefully wasting my time with your intentional nonsense.
|
|
|
|
|
David1987 wrote: Also in case you hadn't noticed, a post like that is the mark of a troll. There
is no doubt about it. You are purposefully wasting my time with your intentional
nonsense.
Because you said it, it must be so.
Couldn't possibly be because I disagree with your opinion.
|
|
|
|
|
Ok I'm bored so I'm going to argue anyway.
jschell wrote: Since the vast majority of programming in the world does not involve that it isn't a significant problem.
Not sure what world you're living in. Every time a vector or a int128 (or larger) is needed, Java will make your life a hell by insisting on manual cloning and writing verbose a.Multiply(b) and the like, for no reason other than that operator overloading can and is abused. Frankly it's none of their busyness whether I choose to abuse their language or not.
But then again maybe you're working for some boring company just maintaining even more boring applications (as they call them, versus actual programs) - you know, the kind of program that doesn't actually do anything but just glues some stuff together.
jschell wrote: And it is not accidental.
Of course it isn't. I was referring to overloading methods in Java, which you can do accidentally because it doesn't require any syntax. It also will happen sooner or later and that's a nasty bug which is hard to find.
You can also override some method (accidentally even, in Java) and have it completely break the Liskov substitution principle.
People will do it, on purpose too. So lets ban virtual methods.
In fact, let's ban strings and IO and arrays and dictionaries and floating point numbers and abstract classes and definitely reflection, all of which are frequently abused.
|
|
|
|
|
David1987 wrote: Not sure what world you're living in. Every time a vector or a int128 (or larger) is needed, Java will make your life a hell by insisting on manual cloning and writing verbose a.Multiply(b) and the like, for no reason other than that operator overloading can and is abused. Frankly it's none of their busyness whether I choose to abuse their language or not.
Presumably you mean 'vector' in terms of mathematics and not in terms of the java class.
Based on that, the point is meaningless. In terms of lines of code in the world the code that requires vectors is so small as to be unmeasurable.
David1987 wrote: But then again maybe you're working for some boring company just maintaining even more boring applications (as they call them, versus actual programs) - you know, the kind of program that doesn't actually do anything but just glues some stuff together
Not sure what that means but most of the applications I write do glue things together. And they also make a lot of money both directly and indirectly.
I will admit that getting a regular paycheck and being able to pay bills is in fact 'boring' compared to the alternative. Applications that make money lead to that sort of boredom.
David1987 wrote: Of course it isn't. I was referring to overloading methods in Java, which you can do accidentally because it doesn't require any syntax. It also will happen sooner or later and that's a nasty bug which is hard to find.
I don't recall it happening to me. I do recall hundreds, thousands, perhaps hundreds of thousands of logic errors of which many are in fact hard to diagnose and sometimes very hard to solve. So I suspect the one of which you speak is lost in the noise.
David1987 wrote: People will do it, on purpose too. So lets ban virtual methods.
I haven't seen many problems with that in java. I can't recall any. I saw more of that sort of problem in C++ with people not understanding such things as the role of a virtual dtor.
And working around the lack of virtual methods can be done but is much harder.
David1987 wrote: In fact, let's ban strings and IO and arrays and dictionaries and floating point numbers and abstract classes and definitely reflection, all of which are frequently abused.
Which again ignores my point.
Operator overloading is often misused. And misused despite there being alternatives.
That isn't true for your examples.
1. Situations exist which those are the only solution. And alternatives are hard or impossible.
2. The incorrect usage compared to correct usage is much more reasonable than versus operator overloading.
|
|
|
|