2015-02-13 14 views
9

tôi đã thử nghiệm với các modifier const trong khi khám phá một loạt các C# hướng dẫn, và đặt một bó const bổ ngữ trong một lớp học như thế này mà không thực sự sử dụng chúng ở bất cứ đâu:Khó hiểu cảnh báo về một lĩnh vực thập phân liên tục trong C#

class ConstTesting 
{ 
    const decimal somedecimal = 1; 
    const int someint = 2; 
    ... 
} 

với lớp này, tôi nhận được cảnh báo sau đây (sử dụng csc):

ConstTesting.cs (3,19): CS0414 cảnh báo: các trường 'ConstTesting.somedecimal' được gán nhưng giá trị của nó không bao giờ được sử dụng

Điều tôi không hiểu là Tôi chỉ nhận được cảnh báo cho const decimal. Các const int không cho tôi bất kỳ cảnh báo, bất kể thứ tự hoặc bất cứ điều gì như thế.

Câu hỏi của tôi là, tại sao điều này xảy ra? Tại sao trình biên dịch csc của tôi lại cảnh báo tôi về một số const ở vị trí đầu tiên, và nếu quan trọng hơn thì tại sao nó chỉ cảnh báo tôi về số const decimal khi tôi viết const int giống hệt như vậy? Sự khác biệt giữa intdecimal là gì?

Xin lưu ý:

    - Tôi không có ReSharper
    - Tôi đang sử dụng VS 2010
    - Tôi chắc chắn 100% không phải 'const` đang được sử dụng bất cứ nơi nào trong mã của tôi.

+2

Để tôi đoán. Một nơi nào đó trong đó '...' mã, bạn đang sử dụng 'someint' nhưng không phải' somedecimal'. Nó khá đáng ngạc nhiên, nhưng nếu bạn không sử dụng một giá trị bạn chỉ định bạn nhận được (chờ nó) .. một cảnh báo nói với bạn nó được gán nhưng không được sử dụng! Đáng ngạc nhiên, phải không? –

+0

Tôi khá chắc chắn rằng tôi đang sử dụng không ở bất cứ đâu. – HavelTheGreat

+0

Tôi khá chắc chắn bạn! Hãy thử 'public class Foo {const int bar = 2;}', bạn sẽ thấy. –

Trả lời

12

Int là một loại giá trị đơn giản có kích thước cố định. Thập phân phức tạp hơn một chút do quy mô. Nếu bạn dịch ngược mã của bạn, bạn sẽ thấy rằng nó trông như thế này:

[DecimalConstant(0, 0, 0, 0, 1)] 
private readonly static decimal somedecimal; 

private const int someint = 2; 

Trong trường hợp số thập phân không phải là một hằng số, nhưng đã biếu không của mscorlib.dll, nơi mà các định nghĩa đúng nếu số thập phân là thuộc tính một DecimalConstant:

public struct Decimal : IFormattable, IComparable, IConvertible, 
IDeserializationCallback, IComparable<decimal>, IEquatable<decimal> 

nhiều hơn trong chiều sâu thăm dò của chủ đề này được đề cập trong this blog post.

+0

Điều này dẫn đến một câu hỏi khác cho dù thay đổi giá trị của 'const thập phân' là một thay đổi phá vỡ như thay đổi giá trị của' const int'. – tia

+2

Điều này thật thú vị. Vì vậy, bạn đang nói, bằng cách sử dụng một 'const thập phân' không thực sự là một" thực "' const'? Ngoài ra, cảm ơn nhiều vì không chỉ nói với tôi rằng tôi là một thằng ngốc và đã sử dụng 'someint' của tôi ở đâu đó. – HavelTheGreat

+0

Đó là chính xác về mặt kỹ thuật. Thuộc tính DecimalConstant nên thực thi hành vi của một hằng số, nhưng đó là một chút khói và gương để giữ cho mọi thứ đơn giản. Câu hỏi của bạn phức tạp hơn một chút so với cái nhìn đầu tiên. Tất nhiên, giải pháp là sử dụng các hằng số của bạn. :) – aRBee

Các vấn đề liên quan